diff --git a/src/simulation/elements/PRTI.cpp b/src/simulation/elements/PRTI.cpp index 658f738c8..1da828a92 100644 --- a/src/simulation/elements/PRTI.cpp +++ b/src/simulation/elements/PRTI.cpp @@ -57,21 +57,24 @@ Element_PRTI::Element_PRTI() //#TPT-Directive ElementHeader Element_PRTI static int update(UPDATE_FUNC_ARGS) int Element_PRTI::update(UPDATE_FUNC_ARGS) { - int r, nnx, rx, ry, fe = 0; - int count =0; + int fe = 0; + parts[i].tmp = (int)((parts[i].temp-73.15f)/100+1); - if (parts[i].tmp>=CHANNELS) parts[i].tmp = CHANNELS-1; - else if (parts[i].tmp<0) parts[i].tmp = 0; - for (count=0; count<8; count++) + if (parts[i].tmp >= CHANNELS) + parts[i].tmp = CHANNELS-1; + else if (parts[i].tmp < 0) + parts[i].tmp = 0; + + for (int count = 0; count < 8; count++) { - rx = sim->portal_rx[count]; - ry = sim->portal_ry[count]; + int rx = sim->portal_rx[count]; + int ry = sim->portal_ry[count]; if (BOUNDS_CHECK && (rx || ry)) { - r = pmap[y+ry][x+rx]; - if (!r) + int r = pmap[y+ry][x+rx]; + if (!r || (r&0xFF) == PT_STOR) fe = 1; - if (!r || (!(sim->elements[r&0xFF].Properties & (TYPE_PART | TYPE_LIQUID | TYPE_GAS | TYPE_ENERGY)) && (r&0xFF)!=PT_SPRK)) + if (!r || (!(sim->elements[r&0xFF].Properties & (TYPE_PART | TYPE_LIQUID | TYPE_GAS | TYPE_ENERGY)) && (r&0xFF)!=PT_SPRK && (r&0xFF)!=PT_STOR)) { r = sim->photons[y+ry][x+rx]; if (!r) @@ -84,16 +87,28 @@ int Element_PRTI::update(UPDATE_FUNC_ARGS) if ((r&0xFF) == PT_SOAP) Element_SOAP::detach(sim, r>>8); - for ( nnx=0; nnx<80; nnx++) + for (int nnx=0; nnx<80; nnx++) if (!sim->portalp[parts[i].tmp][count][nnx].type) { - sim->portalp[parts[i].tmp][count][nnx] = parts[r>>8]; - if ((r&0xFF)==PT_SPRK) - sim->part_change_type(r>>8,x+rx,y+ry,parts[r>>8].ctype); + if ((r&0xFF) == PT_STOR) + { + if (sim->IsValidElement(parts[r>>8].tmp) && (sim->elements[parts[r>>8].tmp].Properties & (TYPE_PART | TYPE_LIQUID | TYPE_GAS | TYPE_ENERGY))) + { + // STOR uses same format as PIPE, so we can use this function to do the transfer + Element_PIPE::transfer_pipe_to_part(sim, parts+(r>>8), &sim->portalp[parts[i].tmp][count][nnx]); + break; + } + } else - sim->kill_part(r>>8); - fe = 1; - break; + { + sim->portalp[parts[i].tmp][count][nnx] = parts[r>>8]; + if ((r&0xFF) == PT_SPRK) + sim->part_change_type(r>>8,x+rx,y+ry,parts[r>>8].ctype); + else + sim->kill_part(r>>8); + fe = 1; + break; + } } } } @@ -105,7 +120,7 @@ int Element_PRTI::update(UPDATE_FUNC_ARGS) if (!sim->parts[i].life) parts[i].life = rand()*rand()*rand(); if (!sim->parts[i].ctype) parts[i].ctype = rand()*rand()*rand(); sim->orbitalparts_get(parts[i].life, parts[i].ctype, orbd, orbl); - for (r = 0; r < 4; r++) { + for (int r = 0; r < 4; r++) { if (orbd[r]>1) { orbd[r] -= 12; if (orbd[r]<1) {