Jump to content

EET v13.4 released


Recommended Posts

 

The intro to chapter 9 (of SoD) plays instead of the one to chapter 9 of ToB when I reach Amkethran (chapter 21).

 

Is it the same for others ?

 

https://www.dropbox.com/s/dquyzwfwpeixvdk/000000106-bug%20intro%20chapter%2021.7z?dl=0

 

Same. Also the chapter screen is missing.

 

It does exactly what is currently in ar5500.bcs

 

IF

Global("EnteredArea","AR5500",0)

THEN

RESPONSE #100

SetGlobal("EnteredArea","AR5500",1)

Explore()

SetGlobalTimer("AMmayorPlotTimer","AR5500",FIVE_ROUNDS)

SetGlobal("Chapter","GLOBAL",21) //This is set

AddJournalEntry(73258,INFO) // Chapter 21 Saradush has been sacked. Yaga-Shura had burst through the wall to find a Bhaalspawn... myself. I was not there, however, so he contented himself with destroying everything in his path, including all the other children of Bhaal that had sought refuge there. Melissan survived, though she seemed devastated. I am one of the few Bhaalspawn that remain... the only others are a group comprised individually of the most powerful of Bhaal's children that remain in Faerun. They have been hunting their siblings, including me, but to what end even Melissan doesn't know. Perhaps they seek to raise Bhaal and become his earthbound avatars. Perhaps they seek to become gods themselves. But they will not rest until I am dead... and their powers combined are enough to destroy even me, so Melissan claims. I have little choice but to take Melissan's offer of help. She knows of a safe haven in the Calishite desert... a place called Amkethran... from which I can plan how best to confront these Bhaalspawn who hunt me and end all questions about my future and my destiny... whatever it may truly be... once and for all.//You get the journal update

TriggerActivation("TRAN5509",FALSE)

TriggerActivation("INFO5509",TRUE)

SetGlobal("BD_Chapter_Save","GLOBAL",9)

SaveGame(23) //You get a chapter 21 start save

TextScreen("CHPTXT9") //This one is the SoD chapter9 text screen without the mos background (is *none* in the 2da)

END

 

Edited by Roxanne
Link to comment

 

 

 

Adjust FPS and fix audio skipping in cutscenes

this one will be greatly improved at some point to take into account DisplayStringWait action that is heavely used by Beamdog content (I will run each referenced WAV file with a tool that analyses the length of track and than add exactly as many SmallWait() ticks needed to not abort sounds triggered by this action). This is why the current tweak is not effective in SoD and other Beamdog's cutscenes. Although you can keep it installed for now since it will help with many vanilla BG2 cutscenes.

 

That's not necessarily the case. DSW() waits for the sound to finish playing (it's supposed to, anyway), then proceeds to the next action. So I'd expect no difference between various FPS settings or languages when it's used. The problem would arise when cutscene does not use DSW().

 

That would be awasome but it seems to work differently for me. Let's take a look at CH1CUT01.BCS (Gorion cutscene)

IF
    True()
THEN
    RESPONSE #100
        CutSceneId("Gorion")
        ...
        DisplayStringWait(Myself,31483) // Listen carefully! If we ever become separated, it is imperative that you make your way to the Friendly Arm Inn.
        DisplayStringWait(Myself,31484) // There, you will meet Khalid and Jaheira. They have long been my friends, and you can trust them.
END

IF
    True()
THEN
    RESPONSE #100
        CutSceneId(Player1)
        ...
END
this part indeed waits for the voice to be finished before going to next action:

DisplayStringWait(Myself,31483) // Listen carefully! If we ever become separated, it is imperative that you make your way to the Friendly Arm Inn.
but next line:

DisplayStringWait(Myself,31484) // There, you will meet Khalid and Jaheira. They have long been my friends, and you can trust them.
doesn't wait for anything at all (I've also tried adding some action right after it - doesn't change anything). On 60 FPS whole next script block is finished while the sound is still playing, so it doesn't wait before moving to the next action / script loop. In this case sound is aborted somewhere in the middle.

 

Due to this I thought that the command only works as intended on 30 FPS and on 60 FPS would need additional SmallWait lasting as long as the track, but after checking this cutscene I'm no longer sure what's up. Should it be reported to Beamdog or does it work as intended?

 

Unfortunately, it does work as expected... When there're multiple CutSceneID() objects in the script, they run their local action queue simultaneously and independently of each other. So, while Gorion would wait for the audio to finish playing, Player1 is not bound by such obligations and proceeds straight to the next area. It could be alleviated by moving the area transition to the dedicated script file (transitions should only be done by Player1) and start it from Gorion's block, but, yeah, that involves more substantial re-structuring than a couple REPLACE_TEXTUALLY. Especially given it also includes skippable mode.

 

PS to be honest, I don't know what can possibly be done to resolve the issue gracefully. For simple cutscenes it's possible with DSW() or additional Wait()s, but stuff like SoD's final battle intro is just too complex. We'd have to split it from string till next string, and even that would still mess up the synch in between, in some scenes (like in the hell bridge scene just before the tower). Even the looping sequence like in BDCUT11/BDCUT11A wouldn't solve it.

Edited by Ardanis
Link to comment

Thanks for all new reports!

 

 

 

The intro to chapter 9 (of SoD) plays instead of the one to chapter 9 of ToB when I reach Amkethran (chapter 21).

 

Is it the same for others ?

 

https://www.dropbox.com/s/dquyzwfwpeixvdk/000000106-bug%20intro%20chapter%2021.7z?dl=0

 

Same. Also the chapter screen is missing.

 

It does exactly what is currently in ar5500.bcs

 

IF
Global("EnteredArea","AR5500",0)
THEN
RESPONSE #100
SetGlobal("EnteredArea","AR5500",1)
Explore()
SetGlobalTimer("AMmayorPlotTimer","AR5500",FIVE_ROUNDS)
SetGlobal("Chapter","GLOBAL",21) //This is set
AddJournalEntry(73258,INFO) // Chapter 21 Saradush has been sacked. Yaga-Shura had burst through the wall to find a Bhaalspawn... myself. I was not there, however, so he contented himself with destroying everything in his path, including all the other children of Bhaal that had sought refuge there. Melissan survived, though she seemed devastated. I am one of the few Bhaalspawn that remain... the only others are a group comprised individually of the most powerful of Bhaal's children that remain in Faerun. They have been hunting their siblings, including me, but to what end even Melissan doesn't know. Perhaps they seek to raise Bhaal and become his earthbound avatars. Perhaps they seek to become gods themselves. But they will not rest until I am dead... and their powers combined are enough to destroy even me, so Melissan claims. I have little choice but to take Melissan's offer of help. She knows of a safe haven in the Calishite desert... a place called Amkethran... from which I can plan how best to confront these Bhaalspawn who hunt me and end all questions about my future and my destiny... whatever it may truly be... once and for all.//You get the journal update
TriggerActivation("TRAN5509",FALSE)
TriggerActivation("INFO5509",TRUE)
SetGlobal("BD_Chapter_Save","GLOBAL",9)
SaveGame(23) //You get a chapter 21 start save
TextScreen("CHPTXT9") //This one is the SoD chapter9 text screen without the mos background (is *none* in the 2da)
END

 

 

 

fixed by renaming SoD CHPTXT9 to CHPTXT9_ (standard EET naming convention for conflicting resources)

 

Not sure if you're changing it for EET Tweaks but the current Teleport spell doesn't work for me unless I didn't understand how to use it.

will take a look when I start updating EET_Tweaks

 

K4thos - I've sent you the UI.menu directly:

 

attachicon.gifBaldr005.jpg

 

attachicon.gifBaldr008.jpg

 

EDIT: I've also sent you instructions on how to fix the function for the BIO creation for multi-class characters.

thanks! Fix ready for next release - GUI auto biography feature now supports multi-class characters and HLA screen in SoD GUI is now available in SoD style.

 

 

New RC up on GitHub. Thanks to all of the awesome feedback from you guys the mod should feel much more polished now.

 

Version 1.0 Release Candidate 5

- Fixed MAJOR regression regarding NPC SoA continuity system caused by engine changes in patch 2.x
- Fixed problem with not working NPC Override scripts after SoD->SoA transition (damn DisableAI command, wasted too much time before finding the obvious cause)
- Fixed random tables item quirks (mod now uses old 2da files and the same names as BGT)
- Added new function that can be used by modders to easily patch BG1 random tables dummy item names. Supported platforms: BG1, BG:EE, Tutu, BGT, EET
- Fixed water layers via argent77's code (this time for sure)
- Day/Night movies no longer shows up in interiors
- Kicked NPCs won't try to initiate post dialogue after spawned again
- Fixed regression in EET_modConverter 'Chapter_patcher.tph', also added support for commands written with whitespace between commas
- Fixed support for 'Story mode' (needs testing)
- Fixed vanilla BG:EE bug - duplicating Rasaad GAM entries
- Fixed problem with spawning Rasaad too early in Trademeet
- Changed vanilla code that for whatever reason sets Aerie's BeenInParty flag even if she wasn't in party at all
- Implemented auto biography GUI feature depending on the chosen campaign (workaround for the vanilla system that doesn't work when engine_mode = 1)
- SoD GUI now supports High Level Abilities selection
- added scrollbar to SoD GUI kits selection menu
- Removed SCRL1V importation - Dimension Door scroll no longer exists in vanilla BG:EE. EET now copies version of this file from patch 1.3 to Override in case some mods still use it
- Updated 'EET_functions.tph' - also included in updated BG2:EE NPC compatibility patches (no other changes)
- Resolved compatibility problem with mods that use Player initiated dialogues system
- Resolved compatibility issue with Margarita NPC - please re-install setup-EET_end finalise component if you have it installed
- All vanilla BG1 and BG2 areas added to console menu (if there is a reference for BG:EE and BG2:EE areas than let me know)
- Added XP adjustment after spawning NPC in ToB
- Thieves Guild time limit disabled when you return to old areas
- EET no longer uses HANDLE_CHARSETS - all TRA files have been converted to UTF-8 without boom to solve the issue with M_EET.LUA file (if the game crashed on you with non-English language than this will fix it).

 

Known problems:
- Fate Spirit in ToB don't acknowledge Dynaheir, Khalid and Yoshimo death if they have not been really killed during game. The dialogue checks for STATE_REALLY_DEAD - what is the best way to give them this state? The easiest way would be using Kill("DV") but this action triggers the death scream even if they are outside party in completely different area...
- auto biography GUI feature doesn't work with multi-class characters yet
- HLA menu in SoD GUI uses BG2:EE GUI art. As far as I know SoD variant of the art doesn't exist. Looking for help regarding this task

- and yeah, those SoD links still didn't make it. Soon...

No update pack for those with RC4 + all intermediate patches (understandable when looking at contents of RC5)

Does it still make sense to report issues on RC4 + PidFix + Hotfix + some local fixes for NPC spawning issues (given that the issue is not on the RC5 list) or is it better to do a new install?

 

 

Creating patch that fixes all of these would be very time consuming. Also save games are affected by some of this stuff. But if you have all previous hotfixes installed than it still make sense to report things not listed in the changelog. As for the NPC spawning issues - all previously reported stuff have been fixed in RC5. Of course new installation would be better but that's just too damn time consuming to make new installation every few days, so probably not worth it.

 

 

 

 

 

 

Adjust FPS and fix audio skipping in cutscenes

this one will be greatly improved at some point to take into account DisplayStringWait action that is heavely used by Beamdog content (I will run each referenced WAV file with a tool that analyses the length of track and than add exactly as many SmallWait() ticks needed to not abort sounds triggered by this action). This is why the current tweak is not effective in SoD and other Beamdog's cutscenes. Although you can keep it installed for now since it will help with many vanilla BG2 cutscenes.

 

That's not necessarily the case. DSW() waits for the sound to finish playing (it's supposed to, anyway), then proceeds to the next action. So I'd expect no difference between various FPS settings or languages when it's used. The problem would arise when cutscene does not use DSW().

 


That would be awasome but it seems to work differently for me. Let's take a look at CH1CUT01.BCS (Gorion cutscene)
IF
True()
THEN
RESPONSE #100
CutSceneId("Gorion")
...
DisplayStringWait(Myself,31483) // Listen carefully! If we ever become separated, it is imperative that you make your way to the Friendly Arm Inn.
DisplayStringWait(Myself,31484) // There, you will meet Khalid and Jaheira. They have long been my friends, and you can trust them.
END

IF
True()
THEN
RESPONSE #100
CutSceneId(Player1)
...
ENDthis part indeed waits for the voice to be finished before going to next action:
DisplayStringWait(Myself,31483) // Listen carefully! If we ever become separated, it is imperative that you make your way to the Friendly Arm Inn.but next line:
DisplayStringWait(Myself,31484) // There, you will meet Khalid and Jaheira. They have long been my friends, and you can trust them.doesn't wait for anything at all (I've also tried adding some action right after it - doesn't change anything). On 60 FPS whole next script block is finished while the sound is still playing, so it doesn't wait before moving to the next action / script loop. In this case sound is aborted somewhere in the middle.

Due to this I thought that the command only works as intended on 30 FPS and on 60 FPS would need additional SmallWait lasting as long as the track, but after checking this cutscene I'm no longer sure what's up. Should it be reported to Beamdog or does it work as intended?

 

Unfortunately, it does work as expected... When there're multiple CutSceneID() objects in the script, they run their local action queue simultaneously and independently of each other. So, while Gorion would wait for the audio to finish playing, Player1 is not bound by such obligations and proceeds straight to the next area. It could be alleviated by moving the area transition to the dedicated script file (transitions should only be done by Player1) and start it from Gorion's block, but, yeah, that involves more substantial re-structuring than a couple REPLACE_TEXTUALLY. Especially given it also includes skippable mode.

 

PS to be honest, I don't know what can possibly be done to resolve the issue gracefully. For simple cutscenes it's possible with DSW() or additional Wait()s, but stuff like SoD's final battle intro is just too complex. We'd have to split it from string till next string, and even that would still mess up the synch in between, in some scenes (like in the hell bridge scene just before the tower). Even the looping sequence like in BDCUT11/BDCUT11A wouldn't solve it.

 

thanks for explanation. This means that the Tweak for FPS adjusting won't help with Beamdog's created cutscenes unfortunately. But it is still useful for vanilla content.

 

 


Baldr001.jpg

 

also fixed

Edited by K4thos
Link to comment

I currently have 2 long swords + 1 which should probably be merged in 1 item. Only the description vary but it's not specific like for the plate mail.

 

They did not get similarly affected by the lore changes of item revision and that's how I found out, I also don't know which one appear when.

 

SW1H05 description :

These swords are usually referred to as doubled-edged swords, war swords, or military swords. In many cases, the long sword has a single-edged blade. There is no single version of the long sword; the design and length vary from culture to culture, and may vary within the same culture depending on the era. Among the most common characteristics of all long swords is their length, which ranges from 35 to 47 inches. In the latter case, the blade is known to take up 40 inches of the total length. Most long swords have a double-edged blade and a sharp point at the tip. Despite the tip, the long sword is designed for slashing, not thrusting. This long sword is particularly good at its job, as it has been enchanted with a few magical properties.

SW1H05S description :

These swords are usually referred to as doubled-edged swords, war swords, or military swords. The blade hums slightly in your hand, the only overt evidence that magic runs through it.

 

I'd suggest taking the first description for all long swords +1.

 

Is this EET made? It doesn't use the _ affixe so i'd guess not but then who would made 2 different identical items for a single game?

 

Edit : Also just got a ring of fire resistance that has a very short description compared to the one I had already. It looks like the Beamdog made generic weapons have very short descriptions compared to the originals and aren't always merged. Still a guess, i'll keep track of other similar cases(though I won't catch them all).

 

Edit 2: Well, another! The ring of Free Action bought in SoD isn't the same as the one looted at the Iron Throne HQ... I'd be curious as to why Beamdog did that...

 

It would be great to handle this stuff before final 1.0 release. I've started looking at items added by SoD (starting with BD prefix) and there are indeed some duplications of items. 2 examples:

(on left side SoD name and on right side BG2:EE)

BDAROW04 => AROW15 //Arrow +3

BDSW1H13 => SW1H09 //Short Sword +2

 

these are exactly the same items so we could just set EET to use BG2:EE item names instead during importation, so the items could stack with each other. In such case SoD items would still exist within game resources but wouldn't be used in the game (unless some mod installed after EET adds references to them).

 

This is a little tricky because there are also some items that looks similar but I think should be kept as they are:

BDAMUL24 => AMUL14 //Amulet of Protection +1 - the one in SoD uses generic description rather than unique lore used in BG:EE/BG2:EE, so even if it works and looks the same it can be considered a different item. On the other hand unique lore for this item doesn't make much sense considering how often it can be found in game. In such case maybe it would be better idea to use SoD generic description on AMUL14? Or maybe mods are responsible for so many instances of this amulet? (if this is the case than it's not really a problem)

BDAROW03 => AROW08 //Flaming Arrow - SoD version adds 1d4 fire damage more compared to Arrow of Fire, so these are not identical items at all

SW1H05S => SW1H05 //S version has 'Silver Weapon' flag set (to be honest no idea what it changes in game - more damage against lycanthropes perhaps?), so these are not the same weapons, even if both use generic description

 

--------

The problem is that this is time consuming task. If someone would be interested in helping with it I can explain how to do it in Near Infinity. Such help would be really appreciated because this way I could spend the time on more demanding tasks instead.

Edited by K4thos
Link to comment

I've started looking at items added by SoD (starting with BD prefix) and there are indeed some duplications of items. 2 examples:

--------

The problem is that this is time consuming task.

As a general idea, you could make a EET tweaks component that just copies the BG2EE item over the BG1&SoD(and a second component that does the reverse) item and let the others just deal with it as they best see, aka they either recommend installing it or not. 2 000 flies, one swap. Yes, of course you'll eventually have to deal with larger&longer issues/what to include etc, but this would do things quite fast, for you, for now.
Link to comment
As a general idea, you could make a EET tweaks component that just copies the BG2EE item over the BG1&SoD(and a second component that does the reverse) item and let the others just deal with it as they best see, aka they either recommend installing it or not. 2 000 flies, one swap. Yes, of course you'll eventually have to deal with larger&longer issues/what to include etc, but this would do things quite fast, for you, for now.

 

 

Sounds bad to be honest. There are probably just a few duplicated items in whole game and they are all from SoD (and maybe some earlier Beamdog's stuff with OH prefix). Changing this stuff is a matter of adding a single row to appropriate dictionary filename array that is used during EET installation. 0 problems with mods considering we still leave all files within game resources and these are just generic items anyway rather than quest related ones (also keep in mind that all mods installed on BG:EE are treated like vanilla resources so are automatically handled too). Actually I'm not quite sure what such tweak you've proposed is meant to do?

Edited by K4thos
Link to comment

As far as i've seen, it seems like there's a good number of items where the difference is only the description. SoD items will generally have a smaller description. Sometimes it'll be appropriate like the Freedom Ring(BDring09 compared to ring09) and sometimes it won't, like for the long swords where 1 description is objectively better than the other. There doesn't seem to be an obvious rule or reason. Some items with unique descriptions could already be found twice in the base game (Evermemory) and Beamdog also used "unique" descriptions for items where it didn't make sense (the ankheg plate mail sold by a druid in SoD has "forged by Taerom Fuirum" in its description).

 

Unique items descriptions are cool because they are part of the world building whereas most of SoD's descriptions are very basic so I think it'd be a loss to have them go.

On the other hand, having multiple items with unique descriptions throughout the world would be kinda weird but then having both would also be weird because the unique descriptions are generally epic for an item that will have the exact same effect as one that is described as unimpressive.

I'm not sure what the good solution would be so I think a good first step would be to inquire Beamdog's devs as to why they did this in the first place.

 

Afaik, the only use of the silver caracteristic is that only silver weapons can hurt Karoug on Balduran's Isle. I haven't seen it mentioned anywhere else and I have no idea why Beamdog would need to create a Silver long sword +1 and not include it anywhere in its name or description...

 

Basically a Beamdog enigma for now.

 

I'm however willing to give my time for this task, i'll be soon done with my RC4 EET playtest at which point i'll take a break and have some time for it.

 

 

I'm also thinking of trying to make a lore friendly and non abusable teleport spell by examining how the pocket plane works, I have literally 0 experience with this though so it's really a shot in the dark.

Edited by GrimLefourbe
Link to comment
I'm also thinking of trying to make a lore friendly and non abusable teleport spell by examining how the pocket plane works, I have literally 0 experience with this though so it's really a shot in the dark.

You may want to wait with this project. The Sandrah for EET mod (to be released as soon as k4thos makes NTotSC available for EET) contains such a feature already.

Link to comment

Thanks for all new reports!

 

 

 

The intro to chapter 9 (of SoD) plays instead of the one to chapter 9 of ToB when I reach Amkethran (chapter 21).

 

Is it the same for others ?

 

https://www.dropbox.com/s/dquyzwfwpeixvdk/000000106-bug%20intro%20chapter%2021.7z?dl=0

 

Same. Also the chapter screen is missing.

 

It does exactly what is currently in ar5500.bcs

 

IF

Global("EnteredArea","AR5500",0)

THEN

RESPONSE #100

SetGlobal("EnteredArea","AR5500",1)

Explore()

SetGlobalTimer("AMmayorPlotTimer","AR5500",FIVE_ROUNDS)

SetGlobal("Chapter","GLOBAL",21) //This is set

AddJournalEntry(73258,INFO) // Chapter 21 Saradush has been sacked. Yaga-Shura had burst through the wall to find a Bhaalspawn... myself. I was not there, however, so he contented himself with destroying everything in his path, including all the other children of Bhaal that had sought refuge there. Melissan survived, though she seemed devastated. I am one of the few Bhaalspawn that remain... the only others are a group comprised individually of the most powerful of Bhaal's children that remain in Faerun. They have been hunting their siblings, including me, but to what end even Melissan doesn't know. Perhaps they seek to raise Bhaal and become his earthbound avatars. Perhaps they seek to become gods themselves. But they will not rest until I am dead... and their powers combined are enough to destroy even me, so Melissan claims. I have little choice but to take Melissan's offer of help. She knows of a safe haven in the Calishite desert... a place called Amkethran... from which I can plan how best to confront these Bhaalspawn who hunt me and end all questions about my future and my destiny... whatever it may truly be... once and for all.//You get the journal update

TriggerActivation("TRAN5509",FALSE)

TriggerActivation("INFO5509",TRUE)

SetGlobal("BD_Chapter_Save","GLOBAL",9)

SaveGame(23) //You get a chapter 21 start save

TextScreen("CHPTXT9") //This one is the SoD chapter9 text screen without the mos background (is *none* in the 2da)

END

 

 

 

fixed by renaming SoD CHPTXT9 to CHPTXT9_ (standard EET naming convention for conflicting resources)

 

Same just happened with the following chapter btw.(RC4)

Link to comment

Unique items descriptions are cool because they are part of the world building whereas most of SoD's descriptions are very basic so I think it'd be a loss to have them go.

On the other hand, having multiple items with unique descriptions throughout the world would be kinda weird but then having both would also be weird because the unique descriptions are generally epic for an item that will have the exact same effect as one that is described as unimpressive.

I'm not sure what the good solution would be so I think a good first step would be to inquire Beamdog's devs as to why they did this in the first place.

 

 

SoD added generic versions of magic items to prevent duplication of unique backgrounds. If it makes things easier on technical side, then you have my blessing to use a single filename for duplicates. I personally don't care any bit at all about backgrounds, as I never read those walls of text :) Do make sure to check the scripts/dialogue for filename references though, as some may have those being checked for.

 

BDAROW03 => AROW08 //Flaming Arrow - SoD version adds 1d4 fire damage more compared to Arrow of Fire, so these are not identical items at all

 

This item was very specifically designed to balance the allied and enemy squads in camp defense battle. To make it effective against the troll wave, but not as much against the others as regular Arrow of Fire was.

Edited by Ardanis
Link to comment
SoD added generic versions of magic items to prevent duplication of unique backgrounds. If it makes things easier on technical side, then you have my blessing to use a single filename for duplicates. I personally don't care any bit at all about backgrounds, as I never read those walls of text :) Do make sure to check the scripts/dialogue for filename references though, as some may have those being checked for.

This checking can be made for vanilla contents - but what about mods? The removal/replacing/renaming of vanilla resources has been a modder's nightmare in old BGT. It should not be repeated in EET. Even if currently you find no script/dialogue which uses the references, you may not know about each mod that uses them. You can easily create bugs for others by fiddling with such resources. In the end you will create incompatibilities just to gain cosmetic adjustments.

Edited by Roxanne
Link to comment

Join the conversation

You are posting as a guest. 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...