Jump to content

Edwin/Edwina Victor/Victoria and the Fun of Transgender Scrolls


cmorgan

Recommended Posts

Scraps of ideas from researching (read that as distracting berelinde from her appointed tasks by poking at her and asking silly questions. Hey, i think I can get a job at Fox research, now...) Edwin/Edwina tranformation.

 

Adding a banter to Edwin's post-transformation banter file,

 

 

/* Fun with Edwin as a Woman */

 

Probably will never play, but heck - why not. This is long form built out of Edwin's BEDWINWO.DLG file, acient long-form EXTERN. This could be rebuilt more efficiently as a CHAIN, or just tidied up, but the code part that is most fun about it is the use of SAY #sringnumber I saw used in JCompton's D'Arnise alia Romance, where preexisting game string references can be swapped in:

 

APPEND ~BEDWINWO~

IF ~InParty("C-ARAN") See("C-ARAN") !StateCheck("C-ARAN",CD_STATE_NOTVALID) Global("c-arEdwinW","LOCALS",0)~ THEN BEGIN c-edwiniswoman
 SAY #8556 /* ~(My condition draws fools like flies to honey).  Silence, you idiot!  You've a death wish that is larger than your swollen head.~ [EDWINW39]  */
 IF ~~ THEN DO ~SetGlobal("c-arEdwinW","LOCALS",1)~ EXTERN ~C-ARANB~ woman1
END

END

APPEND ~C-ARANB~

IF ~~ woman1
 SAY ~[ARAN] Hey, now, I weren't saying naught, now, eh? I was just...~
 IF ~~ THEN EXTERN ~BEDWINWO~ woman2
END

END

APPEND ~BEDWINWO~

IF ~~ woman2
 SAY ~[EDWIN] Your eyes were practically shouting vile depravity at my feminine form.~
 IF ~~ THEN EXTERN ~C-ARANB~ woman3
END

END

APPEND ~C-ARANB~

IF ~~ woman3
 SAY ~[ARAN] Grumbar's Formidable Fists, laddie... err.. m'Lady, I weren't doin' no such thing. It were just that you haven't got used to th' right manner o' walkin in that there body, eh?~
 IF ~~ THEN EXTERN ~BEDWINWO~ woman4
END

END


APPEND ~BEDWINWO~

IF ~~ woman4
 SAY #7276  /* ~And exactly WHAT is wrong with my 'manner?'~ [EDWINW49] */
 IF ~~ THEN EXTERN ~C-ARANB~ woman5
END

END

APPEND ~C-ARANB~

IF ~~ woman5
 SAY ~[ARAN] Well, for one thing, if you keep slammin' down your heels when you walk like that, you are goin' to jounce those feminine attributes right out o' that there robe.~
 IF ~~ THEN EXTERN ~BEDWINWO~ woman6
END

END

APPEND ~BEDWINWO~

IF ~~ woman6
 SAY #7066  /* ~(I will kill ALL of them.  Slowly.  With...with HOT...pokey things and...and coals and...and prods.  Yessssss, prods.  Many, many prods.)~ */
 IF ~~ THEN EXIT
END

END

 

So, dv doesn't change, still = "edwin", but the banter file and script in play does. Next step; figure out what consititues a good check for "Edwina" being in play rather than "edwin", so that a banter or talk fits the feminine form. Gender() I think is not the way to go, as my bet is that if they don't change the DV, they must be shell-scripting somehow, so time to look through the decompiled .bcs for clues...

Link to comment

Nope, I was wrong - he does get a full swap, not juts of soundset, but of everything but the DV. In

 

In EDWIN.BAF

IF
Gender(Myself,FEMALE)
Global("TurnedFemale","LOCALS",0)
THEN
RESPONSE #100
	SetPlayerSound(Myself,61302,MORALE) //   I'll not die like this!  Not like this!
	SetPlayerSound(Myself,61303,HAPPY) //   This is all well and good but could we get back to fixing my little problem now?
	SetPlayerSound(Myself,61304,UNHAPPY_ANNOYED) //   You are doing nothing for my morale, you know.  Wasteful behavior and leaving me like this.
	SetPlayerSound(Myself,61305,UNHAPPY_SERIOUS) //   Yes, yes, you are all a bunch of goodie two-shoes, and yet I am left like this!
	SetPlayerSound(Myself,61306,UNHAPPY_BREAKING_POINT) //   I can see I am going to get no help from the likes of you.  I shall find my own *cure*.
	SetPlayerSound(Myself,61307,LEADER) //   Do not patronize me, I am in no shape to lead.
	SetPlayerSound(Myself,61308,TIRED) //   I tire of walking, I tire of talking, and I tire of the laughable body.  I wish to rest now.
	SetPlayerSound(Myself,61309,BORED) //   Every moment idle is another moment I brood in this dispicable form.  Let's get moving!
	SetPlayerSound(Myself,61310,BATTLE_CRY1) //   Your worthless lives end here!
	SetPlayerSound(Myself,61311,BATTLE_CRY2) //   A death for every second I am in this form!
	SetPlayerSound(Myself,61312,BATTLE_CRY3) //   I feel your stares!  Die!  Die!!
	SetPlayerSound(Myself,61313,DAMAGE) // 
	SetPlayerSound(Myself,61314,DYING) // 
	SetPlayerSound(Myself,61315,HURT) //   If I must wear this form the least you could do is keep it in good health!
	SetPlayerSound(Myself,61316,AREA_FOREST) //   This place is less constricting than the city, though I no more wish the company of nature than people.
	SetPlayerSound(Myself,61317,AREA_CITY) //   I feel the stares of each and every person here.  They mock me with their eyes.
	SetPlayerSound(Myself,61318,AREA_DUNGEON) //   Another dank hole with which to improve my mood.  Joy.
	SetPlayerSound(Myself,61319,AREA_DAY) //   I would see as few days in this form as possible.
	SetPlayerSound(Myself,61321,AREA_NIGHT) //   I would rather spend my nights dreaming of being normal again.
	SetPlayerSound(Myself,61322,SELECT_COMMON1) //   Leave me be.
	SetPlayerSound(Myself,61323,SELECT_COMMON2) //   What is it now?!
	SetPlayerSound(Myself,61324,SELECT_COMMON3) //   I will tolerate only so much.
	SetPlayerSound(Myself,-1,SELECT_COMMON4) // No such index
	SetPlayerSound(Myself,-1,SELECT_COMMON5) // No such index
	SetPlayerSound(Myself,-1,SELECT_COMMON6) // No such index
	SetPlayerSound(Myself,61325,SELECT_ACTION1) //   If I must.
	SetPlayerSound(Myself,61326,SELECT_ACTION2) //   Oh, labor will help.
	SetPlayerSound(Myself,61327,SELECT_ACTION3) //   A waste of my talents.
	SetPlayerSound(Myself,61328,SELECT_ACTION4) //   Stop looking at me.
	SetPlayerSound(Myself,61329,SELECT_ACTION5) //   Very well.
	SetPlayerSound(Myself,61330,SELECT_ACTION6) //   If I must live like this your life shall be as much a hell as mine.
	SetPlayerSound(Myself,-1,SELECT_ACTION7) // No such index
	SetPlayerSound(Myself,-1,SELECT_RARE1) // No such index
	SetPlayerSound(Myself,-1,SELECT_RARE2) // No such index
	SetPlayerSound(Myself,61331,CRITICAL_HIT) //   Even hand to hand I am dangerous.
	SetPlayerSound(Myself,61332,CRITICAL_MISS) //   My talents are wasted on physical blows!
	SetPlayerSound(Myself,61333,TARGET_IMMUNE) //   My spells would serve better, this weapon is useless.
	SetPlayerSound(Myself,61334,INVENTORY_FULL) //   I'll be no packhorse!  Pick up your garbage where I dropped it!
	SetPlayerSound(Myself,61335,PICKED_POCKET) //   I have succeeded, but I despise being reduced to this.
	SetPlayerSound(Myself,61336,EXISTANCE1) //   I am hidden, though I still see this ridiculous form myself.
	SetPlayerSound(Myself,61337,EXISTANCE2) //   Do the outrages never end?  My spell has failed!
	SetPlayerSound(Myself,61338,EXISTANCE3) //   I have set your trap, but my wrath prefers direct combat.
	SetGlobal("TurnedFemale","LOCALS",1)
END

IF
Gender(Myself,MALE)
Global("TurnedFemale","LOCALS",1)
THEN
RESPONSE #100
	SetPlayerSound(Myself,3966,MORALE) //  I'll not die to incompetence!
	SetPlayerSound(Myself,3968,HAPPY) //  I had not thought this group capable of pleasing me, but I am impressed.
	SetPlayerSound(Myself,3969,UNHAPPY_ANNOYED) //  Could my opinion of this group drop ANY lower? Evidently so.
	SetPlayerSound(Myself,3970,UNHAPPY_SERIOUS) //   I warn you, I cannot abide this charity. It is not to my tastes at all.
	SetPlayerSound(Myself,3971,UNHAPPY_BREAKING_POINT) //  No, I do not feel this is working out.You waste opportunity after opportunity. I will stand no more.
	SetPlayerSound(Myself,3972,LEADER) //  It is about time you monkeys realized who should be leader.
	SetPlayerSound(Myself,3973,TIRED) //  I require rest. I demand we stop.
	SetPlayerSound(Myself,3974,BORED) //  Inactive outward, inactive inward. Why do I suffer these fools?
	SetPlayerSound(Myself,3967,BATTLE_CRY1) //  Your worthless lives end here!
	SetPlayerSound(Myself,30694,BATTLE_CRY2) //  Cry for your lives, they are over!
	SetPlayerSound(Myself,30706,BATTLE_CRY3) //  You can do nothing but die!
	SetPlayerSound(Myself,5350,DAMAGE) //  
	SetPlayerSound(Myself,5351,DYING) //  
	SetPlayerSound(Myself,3975,HURT) //  I could use some help here, fools.
	SetPlayerSound(Myself,5345,AREA_FOREST) //  I find the 'great outdoors' chaotic and dirty It needs a shaping will to slap the beasts into proper order. 
	SetPlayerSound(Myself,5346,AREA_CITY) //  The city changes, but the fools within are always the same. 
	SetPlayerSound(Myself,5347,AREA_DUNGEON) //  Could we not have hired some poor fools to do this for us? This is no place for a man of my stature.
	SetPlayerSound(Myself,5348,AREA_DAY) //  Another day and more aimless stumbling about. 
	SetPlayerSound(Myself,5349,AREA_NIGHT) //  Intelligent peoples do not wander about looking for trouble in the evening hours. 
	SetPlayerSound(Myself,3976,SELECT_COMMON1) //  Yes?
	SetPlayerSound(Myself,3977,SELECT_COMMON2) //  What is it now!
	SetPlayerSound(Myself,3978,SELECT_COMMON3) //  Go bother someone else.
	SetPlayerSound(Myself,30709,SELECT_COMMON4) //  I'm busy.
	SetPlayerSound(Myself,30710,SELECT_COMMON5) //  Have you nothing else to do but bother me?
	SetPlayerSound(Myself,30711,SELECT_COMMON6) //  Yes master, what should I fetch now?
	SetPlayerSound(Myself,30712,SELECT_ACTION1) //  Oh all right!
	SetPlayerSound(Myself,30713,SELECT_ACTION2) //  Yes, yes, I see.
	SetPlayerSound(Myself,30714,SELECT_ACTION3) //  One day...one day...
	SetPlayerSound(Myself,30716,SELECT_ACTION4) //  Very well.
	SetPlayerSound(Myself,30717,SELECT_ACTION5) //  Edwin do this, Edwin do that. Somebody get this jerk a banana.
	SetPlayerSound(Myself,30718,SELECT_ACTION6) //  Fear me!
	SetPlayerSound(Myself,30719,SELECT_ACTION7) //  Bah, useless weapon!
	SetPlayerSound(Myself,30716,SELECT_RARE1) //  Very well.
	SetPlayerSound(Myself,30717,SELECT_RARE2) //  Edwin do this, Edwin do that. Somebody get this jerk a banana.
	SetPlayerSound(Myself,30718,CRITICAL_HIT) //  Fear me!
	SetPlayerSound(Myself,30719,CRITICAL_MISS) //  Bah, useless weapon!
	SetPlayerSound(Myself,30720,TARGET_IMMUNE) //  This weapon is worthless.
	SetPlayerSound(Myself,30721,INVENTORY_FULL) //  I will carry no more. Find your trinket upon the ground.
	SetPlayerSound(Myself,30722,PICKED_POCKET) //  The fool saw nothing. Such simple larceny.
	SetPlayerSound(Myself,30723,EXISTANCE1) //  I am concealed, though I see no need.
	SetPlayerSound(Myself,30724,EXISTANCE2) //  My spell disrupted? Argh!!
	SetPlayerSound(Myself,30725,EXISTANCE3) //  I prefer to attack more directly, but a trap will do for now.
	SetGlobal("TurnedFemale","LOCALS",0)
END

 

Which means BioWare figured a good check was to look for a combination of Global("TurnedFemale","LOCALS",{0,1}) as a toggle, combined with a gender check. Pity it is a LOCALS, so that one can't be freferenced, but it makes it easy for us - we can look at Edwin with a Gender("edwin",FEMALE) and everything can be based on that.

 

confirmation,

In EDWINJ.D

IF WEIGHT #7 ~Gender(Myself,FEMALE)
Global("AfterChange","LOCALS",1)~ THEN BEGIN 15 // from:
 SAY ~This is bad.~ [EDWINW01] /* #6921 */
 IF ~~ THEN DO ~SetGlobal("AfterChange","LOCALS",2)
SetGlobalTimer("DegardanSpawn","GLOBAL",86400)
SetPlayerSound(Myself,61302,1)
SetPlayerSound(Myself,61303,2)
SetPlayerSound(Myself,61304,3)
SetPlayerSound(Myself,61305,4)
SetPlayerSound(Myself,61306,5)
SetPlayerSound(Myself,61307,6)
SetPlayerSound(Myself,61308,7)
SetPlayerSound(Myself,61309,8)
SetPlayerSound(Myself,61310,9)
SetPlayerSound(Myself,61311,10)
SetPlayerSound(Myself,61312,11)
SetPlayerSound(Myself,61313,18)
SetPlayerSound(Myself,61314,19)
SetPlayerSound(Myself,61315,20)
SetPlayerSound(Myself,61316,21)
SetPlayerSound(Myself,61317,22)
SetPlayerSound(Myself,61318,23)
SetPlayerSound(Myself,61319,24)
SetPlayerSound(Myself,61321,25)
SetPlayerSound(Myself,61322,26)
SetPlayerSound(Myself,61323,27)
SetPlayerSound(Myself,61324,28)
SetPlayerSound(Myself,-1,29)
SetPlayerSound(Myself,-1,30)
SetPlayerSound(Myself,-1,31)
SetPlayerSound(Myself,61325,32)
SetPlayerSound(Myself,61326,33)
SetPlayerSound(Myself,61327,34)
SetPlayerSound(Myself,61328,35)
SetPlayerSound(Myself,61329,36)
SetPlayerSound(Myself,61330,37)
SetPlayerSound(Myself,-1,38)
SetPlayerSound(Myself,-1,63)
SetPlayerSound(Myself,-1,64)
SetPlayerSound(Myself,61331,65)
SetPlayerSound(Myself,61332,66)
SetPlayerSound(Myself,61333,67)
SetPlayerSound(Myself,61334,68)
SetPlayerSound(Myself,61335,69)
SetPlayerSound(Myself,61336,70)
SetPlayerSound(Myself,61337,71)
SetPlayerSound(Myself,61338,72)~ EXIT
END

 

This is when using LOCALS gets tougher to manage - cross-cre/bcs/dlg stuff is much easier when you have a GLOBAL to play with.

Link to comment

You *can* do a check for Edwin's local variables, you just need to set a global in Edwin's script. Jastey and I do it so we can tell which lovetalk Anomen is on.

 

You would put this in Edwin's script(s)

 

IF 
Global("TurnedFemale","LOCALS",1) 
Global("c-EdwinFemale","GLOBAL",0) 
THEN 
RESPONSE #100
	SetGlobal("c-EdwinFemale","GLOBAL",1) 
END 

IF 
Global("c-EdwinFemale","GLOBAL",1) 
Global("TurnedFemale","LOCALS",0) 
THEN 
RESPONSE #100 
	SetGlobal("c-EdwinFemale","GLOBAL",2)
END

After that, you've got a convenient toggle for checking Edwin's gender.

Link to comment

Ah, I remember, now - cool :) This is the same idea as setting an I_C_T with a global to see if an event has happened, though if I remember correctly you found out that the referencing script needs a "I was not in the party when it happened" backup in .bcs, closing something -

 

If this were something that was going to be referenced a good deal, I would definitely do that. Since this is a once-in-a-game-and-under-some-pretty-tight-conditions, I had better keep the simplest script loadout possible, and forget about trying to foil the Player who decides to put a Girdle of Gender Bending on Edwin while he is a female...

 

heh!

 

so

 

Gender("edwin",FEMALE) plus the regular InParty/InMyArea/CD_S_NV should be enough for the CHAIN reference in the P&T Ideas thread, and any other place I want to sprinkle these.

 

BEDWINWO is going to get called via Interact() from Edwin, so an Interact("c-aran") should get this one riolling, though it needs a timer to make sure parties with Aerie and Aran along with Edwin don't get a sack-up.

 

On the string reference as SAY, here is the lowdown -

The string reference idea, as found in D'Arnise:

 

 

Searching for a simpler way of tying back into existing dialog, I came across this construction in JCompton's D'Arnise Romance:

 

EXTEND_BOTTOM BAERIE 201
IF ~InParty("Nalia") InMyArea("Nalia") !StateCheck("Nalia",CD_STATE_NOTVALID) Global("PGNaliaRomanceActive","GLOBAL",1)~ THEN EXTERN NALIAJ aer3
END

CHAIN NALIAJ aer3
~Now, really, Aerie, that is quite enough. These ploys for sympathy are wholly unbecoming and entirely unnecessary. I don't think you realize just how demeaning this sort of thing is, or how embarrassing it is for the rest of us!~
== BAERIE ~Ploys for sympathy? How can you say such a thing? I'm not the one who... who picked him up in a seedy bar, while crying for help! And who never misses an opportunity to remind him of everything she lost in her palace!~
== NALIAJ ~I was *not* crying! And that is hardly the same thing! Many lives were at stake then! You, Aerie... this is simple manipulation, and it's an insult to <CHARNAME>, asking him to give your life some meaning lest you throw it away.~
== NALIAJ ~If you can't use your abilities to help <CHARNAME> and help others because you can't see past the scars on... of your past, then that's your own concern.~
== BAERIE ~I don't have to listen to this! I don't! You're just as bad as anybody, Nalia, and it's arguments like this that make this awful earthbound life so terrible!~
== BAERIE ~I can't live like this anymore! I can't!~
END
++ #56288 /* ~Life down here isn't so wretched, Aerie.~ */ EXTERN BAERIE 202
++ #56289 /* ~Well, you're going to have to accept it, Aerie. You're going to have to find the strength to face up to it.~ */ EXTERN BAERIE 203
++ #56290 /* ~Don't say that...we'll find some way to restore your wings, I promise!~ */ EXTERN BAERIE 206
++ #56291 /* ~If you continue to act so weak and maudlin, then I agree...you'll never survive.~ */ DO ~SetGlobal("AerieRomanceActive","GLOBAL",3)~ EXTERN BAERIE 210

 

 

The really interesting part is this leveraging of existing static game resources:

END
++ #56288 /* ~Life down here isn't so wretched, Aerie.~ */ EXTERN BAERIE 202
++ #56289 /* ~Well, you're going to have to accept it, Aerie. You're going to have to find the strength to face up to it.~ */ EXTERN BAERIE 203
++ #56290 /* ~Don't say that...we'll find some way to restore your wings, I promise!~ */ EXTERN BAERIE 206
++ #56291 /* ~If you continue to act so weak and maudlin, then I agree...you'll never survive.~ */ DO ~SetGlobal("AerieRomanceActive","GLOBAL",3)~ EXTERN BAERIE 210

 

where instead of using replication of the string or COPY_TRANS, the original string is called. This works on BGII (SoA or ToB) because the foundation for BGT and other mods uses a dialog.tlk that remains (relatively) untouched.

Link to comment

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...