Claymix
Junior Member
Posts: 4
Threads: 1
Joined: Jan 2019
Reputation:
0
|
Switch case issue
I've been working on a custom story for awhile now and I've had a switch case bit of code that has been driving me nuts. For some reason, two of the cases trigger instantly, regardless of what I have it set to. To me, it seems like a weird glitch, although I'm sure it's actually a simple mistake I've made. The naughty cases are case 1 and case 3. Both cases are over instantly when they are triggered, causing the next case (2 and 4) to trigger at the same time. The weird thing is that case 3 has nearly always been that way, but case 1 only recently started to misbehave and I haven't touched this part of the code at all!
Here is the switch case script. Sorry if the formatting is weird, it didn't paste quite nicely. I tried to clean it up.
void Dream(string &in asTimer) { AddLocalVarInt("DreamStep", 1); float fEventSpeed = 5; switch(GetLocalVarInt("DreamStep")) { case 1: AddEntityCollideCallback("servant_brute_2", "BruteDoor", "BruteBreakDoor", true, 1); AddEntityCollideCallback("Player", "EnterRoomArea", "EnterRoom", true, 1); SetPlayerHealth(50); FadeOut(0); SetMessage("ChapterOneMisc", "IntroQuote", 11.5f); SetPlayerActive(false); TeleportPlayer("DreamStart"); SetSanityDrainDisabled(true); PlayMusic("DreamWhisper.ogg", false, 1, 1, 5, false); SetPlayerMoveSpeedMul(0.2f); SetPlayerRunSpeedMul(0.3f); SetPlayerLookSpeedMul(0.3f); FadeGlobalSoundSpeed(0.6f, 1); fEventSpeed = 12; AddDebugMessage("Case1 initializing", true); break;
case 2: for(int g = 1; g <= 51; g++) SetEntityActive("13_burner_" +g, true); SetPlayerActive(true); PlaySoundAtEntity("", "sanity_damage.snt", "Player", 0.0f, false); FadeIn(0.1f); FadeImageTrailTo(2, 1); PlayMusic("29_amb.ogg", true, 1, 1, 5, false); fEventSpeed = 10; AddDebugMessage("Case2 initializing", true); break;
case 3: SetEntityActive("servant_brute_2", true); CreateParticleSystemAtEntity("", "ps_hit_wood.ps", "DoorBreak", false); PlaySoundAtEntity("", "break_wood.snt", "BruteDoor_1", 0, false); SetEntityActive("FirstDoor", false); StartPlayerLookAt("servant_brute_2", 1, 1, ""); AlertEnemyOfPlayerPresence("servant_brute_2"); fEventSpeed = 5; AddDebugMessage("Case3 initializing", true);
case 4: fEventSpeed = 5; AddDebugMessage("Case4 initializing", true); break;
case 5: CheckPoint ("DeathRespawn", "PlayerStartBed", "DeathRespawn", "DeathRespawn", "DeathRespawn"); StartPlayerLookAt("AreaDreamLook", 0.5f, 1, ""); AddTimer("", 2, "StopLook"); TeleportPlayer("Dream1"); AlertEnemyOfPlayerPresence("servant_brute_2"); SetSwingDoorClosed("dreamdoor", false, false); SetSwingDoorDisableAutoClose("dreamdoor", true); AddPropForce("dreamdoor", 0, 0, 3000, "world"); fEventSpeed = 3; AddDebugMessage("Case5 initializing", true); break; } if(GetLocalVarInt("DreamStep") < 5) AddTimer("Dream1", fEventSpeed, "Dream"); }
(Case 4 is blank because it has always triggered at the same time as 3)
Thanks so much!
(This post was last modified: 01-15-2019, 01:40 PM by Mudbill.)
|
|
01-15-2019, 05:05 AM |
|
Mudbill
Muderator
Posts: 3,881
Threads: 59
Joined: Apr 2013
Reputation:
179
|
RE: Switch case issue
First off, I see this is a timer function. How are you calling it? Can you post the initial call to this function as well? Could it be calling the timer double at times?
The fEventSpeed variable should be set using floats instead of ints. When you set a float to a non-decimal number, it's actually set to an int and implicitly cast to a float. So fMyFloat = 5; is discouraged. Use fMyFloat = 5.0f; instead. This can help you avoid unexpected precision results.
The first time this function is called, DreamStep is set to 1, then it runs case 1 and breaks. After that, it adds a new timer which is meant to be 12 seconds, but due to the above, this might not be the case. Try printing out fEventSpeed before you call the timer.
if(GetLocalVarInt("DreamStep") < 5) { AddDebugMessage("fEventSpeed = " + fEventSpeed, false); AddTimer("Dream1", fEventSpeed, "Dream"); }
(This post was last modified: 01-15-2019, 01:59 PM by Mudbill.)
|
|
01-15-2019, 01:59 PM |
|
Claymix
Junior Member
Posts: 4
Threads: 1
Joined: Jan 2019
Reputation:
0
|
RE: Switch case issue
(01-15-2019, 01:59 PM)Mudbill Wrote: First off, I see this is a timer function. How are you calling it? Can you post the initial call to this function as well? Could it be calling the timer double at times?
The fEventSpeed variable should be set using floats instead of ints. When you set a float to a non-decimal number, it's actually set to an int and implicitly cast to a float. So fMyFloat = 5; is discouraged. Use fMyFloat = 5.0f; instead. This can help you avoid unexpected precision results.
The first time this function is called, DreamStep is set to 1, then it runs case 1 and breaks. After that, it adds a new timer which is meant to be 12 seconds, but due to the above, this might not be the case. Try printing out fEventSpeed before you call the timer.
if(GetLocalVarInt("DreamStep") < 5) { AddDebugMessage("fEventSpeed = " + fEventSpeed, false); AddTimer("Dream1", fEventSpeed, "Dream"); }
OH GOOD GRIEF. You're right. The timer is being called twice because I got cute with the code. I set up an if/else statement in the OnStart that checked if debug mode was on and if the player had the 1.3 Justine patch. From there, it called the "Dream" timer. But I also had a separate timer earlier in the OnStart that I had used originally to skip to a certain part of the cutscene. During testing, I changed this timer to "Dream" as well on accident so that there were two of them!
Anyway, I changed the ints to floats... good catch! I was lazy when I wrote the code.
Thanks a million, Mudbill. You're a life saver. I knew it was something stupid I'd done. Code can unforgivingly make you look like an idiot sometimes.
I'm glad that the community here is still active, considering I joined custom story creation late in the game!
|
|
01-15-2019, 09:44 PM |
|
Mudbill
Muderator
Posts: 3,881
Threads: 59
Joined: Apr 2013
Reputation:
179
|
RE: Switch case issue
Forums aren't too active these days, but we still hang around, especially on the Discord server.
|
|
01-16-2019, 09:45 PM |
|
Claymix
Junior Member
Posts: 4
Threads: 1
Joined: Jan 2019
Reputation:
0
|
RE: Switch case issue
Would you suggest using the Discord for custom story development questions?
|
|
01-16-2019, 09:58 PM |
|
Mudbill
Muderator
Posts: 3,881
Threads: 59
Joined: Apr 2013
Reputation:
179
|
RE: Switch case issue
Absolutely. You'd be able to get answers much quicker.
If you wish to join, I feel like I need to nudge that some of the people there can be very unserious and joke a lot. But we will help where possible.
|
|
01-17-2019, 06:20 PM |
|
Claymix
Junior Member
Posts: 4
Threads: 1
Joined: Jan 2019
Reputation:
0
|
RE: Switch case issue
Cool beans! Thanks for the tip. A joking atmosphere is fine by me.
(This post was last modified: 01-17-2019, 06:26 PM by Claymix.)
|
|
01-17-2019, 06:26 PM |
|
|