Jump to content

EXE editing & programming issues


MrFlibble

Recommended Posts

took alook myself but dont think ive found what your looking for, however managed to figure out how text and some other works

there is a loop beginning at

ovr199:0603                  loc_5BB43:   

which seems to loop until its time to change frame/sound/text not sure how it works as i havnt looked into the variables which control it... this maybe it tho

the rest tho...

main movieplaying function call is (this is the call from the end of game function)

ovr185:0056 9A 2A 00 F0 42                    call    j_MoviePlayer

data is actually loaded for this function into global vars in this call here,

; int __cdecl far introLoad(__int32 movieFileDataPtr,int movieTextData,int movieData,int)

ovr185:00A4 9A 20 00 F0 42                    call    j_introLoad

the data structures it accepts are as follows

00000000 _movieFileData  struc ; (sizeof=0x8)

00000000 filename        dd ?                                        ; offset (00043420)

00000004 hasAnotherMovie? db ?            ; Not entirely sure, but if its got no value, no more movies will play after this one

00000005 frameNumber    db ?              ; start movie from this frame (depends on animmode)

00000006 animMode        dw ?

00000008 _movieFileData  ends

animMode is used in multiple ways, bit 0-1 are used to decide how to handle frame selection (it doesnt always use the value in frameNumber).

and the rest of animMode (thats understood, altho no guarantees these are exact) are in this enum

00000004 ; enum _movieAnimMode (bitfield)

00000004 _movieAnimMode_FadeoutWithText  = 4

00000008 _movieAnimMode_FadeOut  = 8

00000010 _movieAnimMode_FadeOutAnd?  = 10h

00000020 _movieAnimMode_DrawBorder  = 20h

00000080 _movieAnimMode_FadeInWithText  = 80h

00000400 _movieAnimMode_400  = 400h

00000400

text play struct

00000000 _movieText      struc ; (sizeof=0xA)

00000000 stringID        dw ?

00000002 textColor      dw ?

00000004 MovieSayBefore  db ?                      ; if this movie number has passed/been played, this text will be skipped

00000005 YPos            db ?

00000006 waitTime        db ?                      ; Time to wait before displaying text

00000007 anonymous_7    db ?

00000008 fadeSpeed      dw ?

0000000A _movieText      ends

data from the exe (final atreides in palace movie), essentially each entry in filedata is one cutscene

dseg:19A8 BC 1B 42 43 23 00+movieFinalAtre  _movieFileData <aAfinala, 23h, 0, 7>        ; DATA XREF: gameEndingPlay:loc_51900o

dseg:19A8 07 00                                                                        ; "AFINALA"

dseg:19B0 C4 1B 42 43 3C 00+stru_44DD0      _movieFileData <aEfinala_0, 3Ch, 0, 42h>    ; "EFINALA"

dseg:19B8 BC 1B 42 43 28 00+stru_44DD8      _movieFileData <aAfinala, 28h, 0, 42h>      ; "AFINALA"

dseg:19C0 C3 1B 42 43 10 0A+                _movieFileData <aAfinala+7, 10h, 0Ah, 0>

dseg:19C8 CC 1B 42 43 37 00+                _movieFileData <aEfinalb, 37h, 0, 3>        ; "EFINALB"

dseg:19D0 CC 1B 42 43 14 01+                _movieFileData <aEfinalb, 14h, 1, 43h>      ; "EFINALB"

dseg:19D8 D4 1B 42 43 14 00+                _movieFileData <aAfinalb, 14h, 0, 42h>      ; "AFINALB"

dseg:19E0 C3 1B 42 43 23 0A+stru_44E00      _movieFileData <aAfinala+7, 23h, 0Ah, 8>

dseg:19E8 C3 1B 42 43 00 00+                _movieFileData <aAfinala+7, 0, 0, 0>

dseg:19F0 14 00 01 00 00 9A+movieFinalAtreText _movieText <14h, 1, 0, 9Ah, 1, 3, 30Eh>  ; DATA XREF: gameEndingPlay+9Bo

dseg:19FA 15 00 04 00 01 9A+                _movieText <15h, 4, 1, 9Ah, 2, 3, 227h>

dseg:1A04 16 00 01 00 02 9A+                _movieText <16h, 1, 2, 9Ah, 1, 3, 320h>

dseg:1A0E 17 00 01 00 04 9A+                _movieText <17h, 1, 4, 9Ah, 1, 3, 30Eh>

dseg:1A18 18 00 01 00 04 9A+stru_44E38      _movieText <18h, 1, 4, 9Ah, 1, 3, 320h>

dseg:1A22 FF FF FF FF 00 00+                _movieText <0FFFFh, 0FFFFh, 0, 0, 0, 0, 0>

Link to comment
Share on other sites

Correct me if I'm wrong, but isn't it possible to calculate framerate from the delta given in the WSA file header:


WSA header {
   Int16 NumFrames; // Number of frames in the sequence
   Int16 Width;     // Width and height of the images
   Int16 Height;
   Int32 Delta;     // Frames per Sec = Delta /(2^10).

   Int32[0..NumFrames + 1] Offsets; // Image offsets
}

The above was adapted from Vladan Bato's documentation and serves me fine for Dune 2 v1.07 files (although I haven't actually used the calculated framerate for anything yet) - I am aware that there are differences between the C&C, Dune 2 v1.0 and Dune 2 v1.07 WSA formats, but I can't find any other use mentioned anywhere for these bytes :/

I checked with the scummvm guys about this in the past, according to what they said,  the wsa format used by Dune 2 doesn't include this information (the WSA format used by Kyrandia and other later Westwood games does OTOH).. :/

Link to comment
Share on other sites

I checked with the scummvm guys about this in the past, according to what they said,  the wsa format used by Dune 2 doesn't include this information (the WSA format used by Kyrandia and other later Westwood games does OTOH).. :/

Fair enough. Did they say what those 4 bytes are for? I'll need to update my code...

Link to comment
Share on other sites

Hmm.... check something intriguing out:

This guy noticed that the enemy should actually be allowed to build Siege Tanks in mission 5... I wonder what other tricks does this game have hidden and how can this help us manipulate it. What's intriguing is the fact that the Ordos player does not get access to the second upgrade and Siege Tanks until mission 7. What's going on here?

-Daelin

Link to comment
Share on other sites

I kinda doubt Siege Tanks can be produced on mission 5, this would mean AI players can have a different tech level setup compared to the human players commanding the same House. As for Siege Tanks inaccessible to the Ordos in mission 6, it's normal (I suppose), since this House is on "hard" difficulty and relies on mass cheap units most of the time during the campaign.

Link to comment
Share on other sites

Does the AI's tech level actually matter in Dune II?

Well, yes, it does, since you can only define unit-types (Foot/Wheeled/Tracked) in team scripts. If it were not the case, you'd be overwhelmed by Siege Tanks and Launchers on mission 4 when the AI first gets Heavy Factories.

You may notice that all units in Dune II have the tech level set to 0, and even if you change this, it does not affect anything. The only tech level that matters is that of the upgrades that limit unit accessibility. As for the structures, the AI really seems to ignore the tech level when it replaces destroyed buildings.

Link to comment
Share on other sites

Does the AI's tech level actually matter in Dune II? In C&C, the AI produces whatever the teams tell it to produce, totally ignoring tech restrictions.

That's a good question but infact the computer builds based on some restrictions too. Those I have observed:

   1. The current upgrade of the Light Factory/Heavy Factory matters. If you would give the computer a two-times upgraded Heavy Factory in mission 5 (like in the example of the video) I have the feeling that it will be able to build Siege Tanks. I do not know what happens if you destroy the factory and he rebuilds it. Does he regain a fully-upgraded factory or does he actually upgrade it to the previous level? (I do not seem to understand how these upgrades affect the computer but they seem to actually matter). Same for Hi-Tech and ornithopters in mission 7. I haven't destroyed the hi-tech, watch the computer repair it, and notice whether he swarms me with ornithopters again.

   2. Building-restrictions are DEFINITELY followed! In the original (1.07v - without any patch from Flibble), does the computer ever build Devastators or Sonic Tanks in the later missions (8 & 9)? As far as I know, atleast when I played the ordos (mission 8 - atreides palace map) and the atreides (mission 9), none of the computers had IX, and therefore never built devastators/deviators/sonic tanks. Prerequisites is something the computer takes into account when training units (but apparently as Flibble mentions - not when rebuilding units).

Rebuilding units is something that was added later (only through patch 1.07) and it probably was not even thoroughly tested. Computer seems to ignore everything, from building with no adjacencies (isolated area), over units, and even without actually caring about tech-level. What's also interesting was that I once destroyed a rocket turret in mission 6 and he immediately reconstructed it. I wonder if the AI "keeps for backup" a building to place immediately after it has been destroyed (should've tried back then and reload the game and try destroying something else to see what happens). This behavior does not really matter that much however, since it is too hardcoded for us to actually be able to modify, imo. :)

I also may have an explanation for the element mentioned in the video. The upgrade-exceptions (such as Ordos Heavy Factory and Harkonnen Light Factory) seem to be ignored in the case of the computer. This would explain why you can actually upgrade the Heavy Factory when capturing the Ordos factory. OR maybe the restriction is "global", so if the building is not upgraded, yet YOU can twice-upgrade it for that mission, since Atreides get to do so in order to access Rocket Launchers. So when capturing the building, the system does not take into account that you have actually conquered a "Ordos" factory, to limit the upgrades to 1 for that mission (though the TOTAL number of upgrades for an Ordos factory is indeed limited to 2). Quite interesting :)

-Daelin

Link to comment
Share on other sites

If you would give the computer a two-times upgraded Heavy Factory in mission 5 (like in the example of the video) I have the feeling that it will be able to build Siege Tanks. I do not know what happens if you destroy the factory and he rebuilds it. Does he regain a fully-upgraded factory or does he actually upgrade it to the previous level? (I do not seem to understand how these upgrades affect the computer but they seem to actually matter).

It seemed to me at one time that the factories that the AI has start already fully upgraded, but it might very well be it just upgrades them immediately at the beginning of a mission.

Same for Hi-Tech and ornithopters in mission 7. I haven't destroyed the hi-tech, watch the computer repair it, and notice whether he swarms me with ornithopters again.

What if the AI just ran out of money? 'Thopters cost quite a lot, and there has to be some building priority for untis the AI relies on (e.g. it will build Siege Tanks if it has access to them and enough money, and not Combat Tanks).

Building-restrictions are DEFINITELY followed! In the original (1.07v - without any patch from Flibble), does the computer ever build Devastators or Sonic Tanks in the later missions (8 & 9)? As far as I know, atleast when I played the ordos (mission 8 - atreides palace map) and the atreides (mission 9), none of the computers had IX, and therefore never built devastators/deviators/sonic tanks. Prerequisites is something the computer takes into account when training units.

Yes, the AI players don't have IX structures in missions 8 and 9, and I did not alter that in any patch yet. However, the IX prerequisite for 'thopters and special tanks are the only example of building-unit dependency in Dune II. Once again, this does not have anything to do with the tech level. You can give a Harkonnen AI a Heavy Factory and an IX on mission 1, and it will build Devastators.

Rebuilding units is something that was added later (only through patch 1.07) and it probably was not even thoroughly tested. Computer seems to ignore everything, from building with no adjacencies (isolated area), over units, and even without actually caring about tech-level.

Actually, this is not completely the case. I have observed the AI sometimes rebuild structures in v1.0. My guess is that in v1.07, all restrictions for building structures were removed to make the AI rebuild its base faster and more efficiently (e.g. the AI never cares to remove soldiers that come from a destroyed building from the site, so if it couldn't place a structure over units, its own soldiers would prevent it from rebuilding if they remained on the spot; AFAIK, in C&C the soldiers that emerge from strucutres automatically leave the original site of that structures).

What's also interesting was that I once destroyed a rocket turret in mission 6 and he immediately reconstructed it. I wonder if the AI "keeps for backup" a building to place immediately after it has been destroyed (should've tried back then and reload the game and try destroying something else to see what happens).

This is true. If you capture an AI's Const Yard in v1.07, you'll most probably see it has already constructed (or is in the process of such construction) a building that it intends to replace (either an already destroyed one, or it might also calculate the probability of losing a building). If you place such a building, it will still belong to the AI though :)

I also may have an explanation for the element mentioned in the video. The upgrade-exceptions (such as Ordos Heavy Factory and Harkonnen Light Factory) seem to be ignored in the case of the computer. This would explain why you can actually upgrade the Heavy Factory when capturing the Ordos factory. OR maybe the restriction is "global", so if the building is not upgraded, yet YOU can twice-upgrade it for that mission, since Atreides get to do so in order to access Rocket Launchers. So when capturing the building, the system does not take into account that you have actually conquered a "Ordos" factory, to limit the upgrades to 1 for that mission (though the TOTAL number of upgrades for an Ordos factory is indeed limited to 2). Quite interesting :)

Actually, segra posted the code chunk for the Ordos Heavy Factory:

http://forum.dune2k.com/index.php?topic=20456.msg345772#msg345772

Might be helpful :)

Link to comment
Share on other sites

It seemed to me at one time that the factories that the AI has start already fully upgraded, but it might very well be it just upgrades them immediately at the beginning of a mission.

Well I have a question about this: when pre-placing buildings on the map can you specify the number of upgrades the building has? Because I remember that in the first mission of DuneX for Fremen, you mentioned that you had pre-placed a "fully upgraded heavy factory" on the map. If this can be done, we could check this hypothesis and see how the AI handles upgrades (for instance if it upgrades buildings placed on the map, how he handles them after "Reconstructing" and so on). This could be quite useful for DuneX missions too, as it allows us to understand better how the AI works.

What if the AI just ran out of money? 'Thopters cost quite a lot, and there has to be some building priority for untis the AI relies on (e.g. it will build Siege Tanks if it has access to them and enough money, and not Combat Tanks).

Priority was somewhere mentioned in Nyerguds editor too, but I did not mean this. In DuneX missions I observed that the AI would heavily build 'Thopters in missions 8 and 9, but not in the original Dune 2. Why? Because in the original the computer does not have IX buildings placed. And no, in this case the AI had enough money. When playing I tend to neglect attacking his harvesters/refineries and reducing its supplies. :) He kept repairing his buildings too, so I suspect he had a lot of money.

Yes, the AI players don't have IX structures in missions 8 and 9, and I did not alter that in any patch yet. However, the IX prerequisite for 'thopters and special tanks are the only example of building-unit dependency in Dune II. Once again, this does not have anything to do with the tech level. You can give a Harkonnen AI a Heavy Factory and an IX on mission 1, and it will build Devastators.

I wasn't refering to tech level here. I understand that the computer igores those.

Actually, segra posted the code chunk for the Ordos Heavy Factory:

http://forum.dune2k.com/index.php?topic=20456.msg345772#msg345772

Might be helpful :)

This is quite irelevant for my point here. What I was talking about was the number of upgrades the game handles when it comes to captured buildings. Does it take into account the number of upgrades of the "original builder" (in the case, Ordos) or does it take into account the number of upgrades of the capturer (in this case, Atreides). In the example above, Atreides can upgrade their Heavy Factories 2 times, while Ordos only ONCE. This would suggest that even if the Heavy Factory is "Ordos previous-owned", after captured the CURRENT-OWNER is taken into consideration when it comes to upgrade, but the ORIGINAL BUILDER matters when it comes to units available (lack of Missile Turrets, presence of Deviators etc.).

-Daelin

Link to comment
Share on other sites

Sorry for double-posting but another problem just crossed my mind and as it is not related to the previous post I thought I'd make a different one.

Do you think there is any way we could actually modify the unit spawned upon building/tank death? Because normally the spawned unit is the infantry, and I was wondering if for example it could be switched to the trooper. Is it possible that the exe may contain this information too? :) (Hint hint, Segra, maybe you can help us here too if you have the time?  ;D).

Flibble, I was thinking about this because in the techtree I suggested I planned on replacing the normal soldiers with the Fremen Soldier/Fedaykins, since the infantry does not have two types of attack. This information would allow us to tweak the infantry as we like and just replace the "upon death" unit with the classical trooper.

Edit: And I was wondering about the same thing related to the Atreides special palace (what type of unit the palace spawns :) ).

-Daelin

Link to comment
Share on other sites

Soldier creation is handled from the UNIT/BUILDING Scripts, however... two internal functions  'scriptFunctionUnitCreateSoldier' and 'scriptFunctionBuildingDestroy' are called from the scripts themselves,

both contain these lines

Hex search: B8040050B8FFFF   only 2 locations will show, first should be the unitcreatesoldier function

seg030:2409 B8 04 00                          mov     ax, 4                               ; Soldier

seg030:240C 50                                push    ax                                  ; TypeIndex

seg030:240D B8 FF FF                          mov     ax, 0FFFFh

seg030:2410 50                                push    ax                                  ; int

seg030:2411 9A 02 09 36 28                    call    unitCreate                          ; Call Procedure

Chance of this happening, is based on the value in the BUILDINGDATA/UNITDATA.'FIELD_E', it compares the value to a ``random`` (from the map seed) number

and will spawn a solider if random is below field_e   (Units: Unknown7 in Nyers editor)

EDIT:  Palace stuff is handled in

seg023:0519                   palaceUnitBuild

From the hardcoded 'houses' data, ('Palace Special' in nyers editor) is used to determine what to do

When mode2 is in use, for Atreides/Fremen, the data located at

dseg:6090 03 00             unitTypeTable  dw 3                                        ; DATA XREF: palaceUnitBuild+1C1r

dseg:6092 05 00             word_494B2      dw 5

dseg:6094 03 00             word_494B4      dw 3

dseg:6096 03 00                             dw 3

Troopers/Trooper/Troopers/Troopers

this is used with a ''real'' (not the map seed) random number, to select which type of unit to create for the palace reinforcements... the loop that creates each unit is checked at

seg023:070F 83 FF 05                          cmp     di, 5                               ; Compare Two Operands

seg023:0712 7C 8B                             jl      short loc_228CF                     ; Jump if Less (SF!=OF)

Link to comment
Share on other sites

Well I have a question about this: when pre-placing buildings on the map can you specify the number of upgrades the building has? Because I remember that in the first mission of DuneX for Fremen, you mentioned that you had pre-placed a "fully upgraded heavy factory" on the map. If this can be done, we could check this hypothesis and see how the AI handles upgrades (for instance if it upgrades buildings placed on the map, how he handles them after "Reconstructing" and so on).

No, you can't specify upgrades for structures in the scenario files. What I meant was that the Harkonnens always get a Light Factory with the first level upgrade already done (to ensure the production of Quads without any upgrades). With the modifications I made in DuneX v1.21, this meant that the Harkonnens would always get access to Siege Tanks, even in mission 1.

Priority was somewhere mentioned in Nyerguds editor too, but I did not mean this. In DuneX missions I observed that the AI would heavily build 'Thopters in missions 8 and 9, but not in the original Dune 2. Why? Because in the original the computer does not have IX buildings placed. And no, in this case the AI had enough money.

I think I misunderstood you. Didn't you say the AI stopped building 'thopters after you attacked his Hi-Tech Factory?

And of course, I never doubted the AI has to have an IX to produce the units that require it. In Command & Conquer this is different as the AI can build whatever is specified in the team scripts without the need to have the appropriate prerequisites.

This is quite irelevant for my point here. What I was talking about was the number of upgrades the game handles when it comes to captured buildings. Does it take into account the number of upgrades of the "original builder" (in the case, Ordos) or does it take into account the number of upgrades of the capturer (in this case, Atreides). In the example above, Atreides can upgrade their Heavy Factories 2 times, while Ordos only ONCE. This would suggest that even if the Heavy Factory is "Ordos previous-owned", after captured the CURRENT-OWNER is taken into consideration when it comes to upgrade, but the ORIGINAL BUILDER matters when it comes to units available (lack of Missile Turrets, presence of Deviators etc.).

As far as I remember, all enemy factories I could capture were already fully upgraded and functioned as if these were the factories of the corresponding side (e.g. if you're Atreides, a captured Ordos Light Factory still can produce Raiders instead of Trikes, and a Harkonnen one only Quads; a captured Ordos Heavy Factory does not produce Launchers etc.; and yes, you can produce the enemy's special tanks from the captured Heavy Factory if you have an IX). This does not work for Const Yards though, as you always have the same list of available structures regardless of whether the CY is your own or a captured one.

I did some testing with v1.0 to see how the AI rebuilds lost structures. For a test, I used a Harkonnen mission 2, gave the AI lots of credits and blew up its Barracks to check whether it will be rebuilt. To check if the AI did anything at all, I captured its Const Yard, and it showed the Barracks was actually under construction and 93% complete. I reloaded the saved game I made before capturing the CY, and waited for the Barracks to be placed (I thought the AI ran out of money while repairing the CY I had to damage to capture), but nothing would happen. Then I captured the CY once again (after more time passed and the AI harvested some more spice), and the Barracks' progress suddenly was only 75%. The only feasible explanation for this is that the AI got into an endless loop of constructing the Barracks over an over again without actually placing it on the map. However, sometimes it can place structures on the map (I observed a Rocket Turret being replaced on Ordos mission 6).

Link to comment
Share on other sites

Thanks Segra for the explanations... This helps a lot!

Flibble.... uhm, doesn't the v.1.00 placement actually have to do with units spawned in place of the destroyed building? :) I mean, turrets rarely spawn soldiers but a barrack spawns. Did you actually "Clear the place" and watch if the computer rebuilds?

-Daelin

Link to comment
Share on other sites

Harkonnen Light Factory is managed here (in the structureCreate function itself)

seg010:00F1 83 7E 0A 00                      cmp    [bp+houseID], 0                    ; Compare Two Operands

seg010:00F5 75 0D                            jnz    short loc_1A534                    ; Jump if Not Zero (ZF=0)

seg010:00F7 83 FE 03                          cmp    si, 3                              ; Compare Two Operands

seg010:00FA 75 08                            jnz    short loc_1A534                    ; Jump if Not Zero (ZF=0)

seg010:00FC C4 5E FC                          les    bx, [bp+gameObjectPtr]              ; Load Full Pointer to ES:xx

seg010:00FF 26 C6 47 4E 01                    mov    es:[bx+_buildingGame.techLevel], 1

Link to comment
Share on other sites

lol thats the IDA auto comments.. had it turned on and didnt bother turning it off

and yeah thats right... cmp subtracts the two operands from each other. if the 2 operands are equal, the result is zero

hence, jump if not zero

opps about SI intended to mention

SI is the Building Type Index (index into the hardcoded building struct

Team0 is harkonnon

if( house == HARKONNEN && buildingType == LIGHTFACTORY )

  building.Techlevel = 1;

Link to comment
Share on other sites

spawning of soldiers? That's a "percentage chance that a soldier will spawn" which is then used on every cell at the moment the building is destroyed. You can just put it on 100% with my editor.

I was perfectly aware of that. Remember that I pointed the field when I also posted the Excel files?  :P I was asking whether Flibble had "cleaned" the place and notice if the computer rebuilds or not! Apparently that's not the problem. :)

-Daelin

Link to comment
Share on other sites

segra, I noticed you updated you post to include the code that determines what units to spawn with the Atreides palace weapon. Thanks :) BTW,do you know that in the Dune II Demo, the palace spawns not only Fremen Troopers, but also Fremen Soldiers/Infantry as well?

Link to comment
Share on other sites

segra, I noticed you updated you post to include the code that determines what units to spawn with the Atreides palace weapon. Thanks :) BTW,do you know that in the Dune II Demo, the palace spawns not only Fremen Troopers, but also Fremen Soldiers/Infantry as well?

Oh yeah, I think I heard of that before, but I never actually tried the demo (any link? :P). And yeah, that code would be pretty nifty if you wish to implement the Fedaykin idea I e-mailed you. :)

-Daelin

Link to comment
Share on other sites

hm wonder why they changed it, if u want that behavior just update the 'spawn table' at 0x3E0B0 (1.07-HS) to

(from the demo exe)

dseg:45A0 04 00                                  dw 4

dseg:45A2 05 00                                  dw 5

dseg:45A4 02 00                                  dw 2

dseg:45A6 02 00                                  dw 2

Link to comment
Share on other sites

hm wonder why they changed it, if u want that behavior just update the 'spawn table' at 0x3E0B0 (1.07-HS) to

(from the demo exe)

dseg:45A0 04 00                                   dw 4

dseg:45A2 05 00                                   dw 5

dseg:45A4 02 00                                   dw 2

dseg:45A6 02 00                                   dw 2

Why? Cause the original infantry is good-for-nothing scum. those units are simply USELESS: slow, weak, almost-no-damage.... why bother turning them into a "superweapon"? cause they are free?

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...