PDA

View Full Version : [Critical] Trying to set ComboS[] on layer 2 - ZC Terminates



ZoriaRPG
11-21-2015, 09:07 AM
In trying to set ComboS for combos on layer 2, using SetLayerComboS(), I find that while it works perfect for Layer 1, if the same instructions are executed for layer 2, ZC crashes--meaning that ZC fully terminates.

If you want the script that causes this, I can send it across. I can also provide a quest with the instructions implemented, for debugging.

Tamamo
11-25-2015, 03:27 PM
It may have something to do with Screen->LayerMap() or Screen->LayerScreen()
Did you try putting in the values manually?
Also what solidity value are you using?

This is the function from std.zh

//A shorthand way to set a combo's solidity on the current layer.
//Layer 0 is the screen itself.
void SetLayerComboS(int layer, int pos, int solidity) {
if (layer == 0)
Screen->ComboS[pos] = solidity;
else
Game->SetComboSolid(Screen->LayerMap(layer), Screen->LayerScreen(layer), pos, solidity);
}

ZoriaRPG
11-28-2015, 04:11 AM
Here is the codeblock:


if ( SWITCHHOOK_USE_LAYER_2 ) { //2
for ( int q = 0; q < 176; q++ ) { //Pass through the screen combos to find a match...
int cmb2 = GetLayerComboI(2,q); //loading them along the way...
cmb2X = ComboX(q); //The combo number for the for loop pass...
cmb2Y = ComboY(q); //... X and Y
int loc = ComboAt(cmb2X,cmb2Y);

if ( ( comboF && cmb2 == comboF ) || ( !comboF && cmb2 == CF_SWITCHHOOK ) ) {
//If D0 is assigned a value above 0, check to see if it matches
//that combo inherent flag, otherwise check if it matches the one
//assigned to the constant CF_SWITCHSHOT.

//If it does....
//int cmb_under =

//if ( switching ) {
if ( ComboCollision(loc,l) ) { //and there is collision between that combo and the hookshot...

//!We need to check every layer...too..for combos on layers higher than 0. (?)
l->DeadState = WDS_DEAD; //Kill the hookshot.

if ( sfx ) Game->PlaySound(sfx); //Play the sound defined in the item script,
if ( !sfx && SFX_SWITCHHOOK ) Game->PlaySound(SFX_SWITCHHOOK); //or the constant if the item editor arg isn't set.

//Store Link's starting position.
lx = CenterLinkX();
ly = CenterLinkY();

//Store the switchshot combo to move.
cmb2X = ComboX(q); //The combo number for the for loop pass...
cmb2Y = ComboY(q); //... X and Y
cmb2D = GetLayerComboD(2,q); //The original data of the switchhook combo.
cmb2S = GetLayerComboS(2,q); //The original solidity of the switchshot combo.
cmb2C = GetLayerComboC(2,q); //The original CSet.

//Store the combo datum for the cumbo that Link is on.

cmb2LD = GetLayerComboD(2,ComboAt(Link->X, Link->Y)); //The combo under Link.
cmb2LS = GetLayerComboS(2,ComboAt(Link->X, Link->Y)); //The solidity of the combo under Link.
cmb2LX = GridX(lx); //The X position
cmb2LY = GridY(ly); //The Y position
cmb2L = ComboAt(cmb2LX,cmb2LY); //The screen index for that combo (Nth of 276).
cmb2LC = GetLayerComboC(2,ComboAt(Link->X, Link->Y));


//Change the combo where Link WAS, to the switchshot combo.
SetLayerComboD(2,cmb2L,cmb2D); //Set its data
SetLayerComboS(2,cmb2L,cmb2S); //and solidity.

//!Setting solidity on layer 2 crashes ZC....BUT
//!the solidity seems to be preserved anyway.

SetLayerComboC(2,cmb2L,cmb2C); //and CSet.


//Move Link to where the old switchshot combo that we moved, WAS.
Link->X = cmb2X;
Link->Y = cmb2Y;


//Move the switchshot combo to where LINK was before he moved...
SetLayerComboD(2,q,cmb2LD); //Set the combo data
SetLayerComboS(2,q,cmb2LS); //and the solidity.
SetLayerComboC(2,q,cmb2LC); //and CSet.


this->Script = 0; //Free the FFC for later use.
this->Data = 0;
Quit();
}
}
}
}

Gleeok
11-29-2015, 03:33 AM
So, does this depend on other things or does this work:


ffc script crash{ void run(){ while(true){ Waitframe(); SetLayerComboS(2, 0, 0); } } }

Tamamo
12-16-2015, 05:16 PM
Confirmed with Gleeoks crash ffc script.
I traced Screen->LayerMap and Screen->LayerScreen, and got the correct values so that's not the issue.

Saffith
12-19-2015, 06:59 PM
You don't have the same problem with ComboD, ComboI, etc., right? For some reason, the code for SetComboSolid is different than the others, and it appears to calculate the screen incorrectly.

ZoriaRPG
12-19-2015, 08:55 PM
You don't have the same problem with ComboD, ComboI, etc., right? For some reason, the code for SetComboSolid is different than the others, and it appears to calculate the screen incorrectly.

It was only ComboS, although i didn't use ComboF, or ComboT in the code where I had this problem. I used ComboD, ComboC, and ComboI--all three worked with no errors--but ComboS caused it to crash. I'll send you the whole script, if you wish.

Saffith
12-19-2015, 11:44 PM
This should be fixed now.