void CppiaStackVar::genDefault(CppiaCompiler *compiler, const CppiaConst &inDefault) { if (argType==etString) { if (inDefault.type == CppiaConst::cString) { JumpId notNull = compiler->compare(cmpP_NOT_ZERO, JitFramePos(defaultStackPos+offsetof(String,__s)).as(jtPointer),(void *)0); String val = module->strings[ inDefault.ival ]; compiler->move(JitFramePos(defaultStackPos).as(jtInt), (int)val.length); compiler->move(JitFramePos(defaultStackPos+offsetof(String,__s)).as(jtPointer), (void *)val.__s); compiler->comeFrom(notNull); } } else { JitFramePos srcPos(defaultStackPos); JitFramePos destPos(stackPos); compiler->move( sJitTemp0, srcPos.as(jtPointer) ); JumpId notNull = compiler->compare(cmpP_NOT_ZERO, sJitTemp0, (void *)0); switch(storeType) { case fsByte: case fsBool: compiler->move( destPos.as(jtByte), JitVal(inDefault.ival).as(jtByte)); break; case fsInt: compiler->move( destPos.as(jtInt), inDefault.ival); break; case fsFloat: compiler->move( sJitTemp0, (void *)&inDefault.dval); compiler->move( destPos.as(jtFloat), sJitTemp0.star(jtFloat)); break; case fsObject: if (inDefault.type==CppiaConst::cInt) compiler->callNative( (void *)intToObject, inDefault.ival ); else if (inDefault.type==CppiaConst::cFloat) compiler->callNative( (void *)floatToObject, (void *)&inDefault.dval ); else if (inDefault.type==CppiaConst::cString) compiler->callNative( (void *)stringToObject, (void *)&module->strings[ inDefault.ival ] ); else break; compiler->move(destPos.as(jtPointer), sJitReturnReg.as(jtPointer)); break; case fsString: // handled case fsUnknown: // ? break; } JumpId defaultDone = compiler->jump(); compiler->comeFrom(notNull); switch(storeType) { case fsByte: case fsBool: compiler->callNative( (void *)objToInt, sJitTemp0.as(jtPointer) ); //compiler->move( destPos.as(jtByte), sJitReturnReg.as(jtByte)); compiler->move( destPos.as(jtInt), sJitReturnReg.as(jtInt)); break; case fsInt: compiler->callNative( (void *)objToInt, sJitTemp0.as(jtPointer) ); compiler->move( destPos.as(jtInt), sJitReturnReg.as(jtInt)); break; case fsFloat: compiler->callNative( (void *)objToFloat, sJitTemp0.as(jtPointer), destPos.as(jtFloat)) ; break; case fsObject: // Should be same pos //compiler->move(destPos.as(jtPointer), sJitTemp0.as(jtPointer)); break; case fsString: // handled case fsUnknown: // ? break; } compiler->comeFrom(defaultDone); } }
void PoisonProjectileSpell::Launch() { ARX_SOUND_PlaySFX(g_snd.SPELL_POISON_PROJECTILE_LAUNCH, &m_caster_pos); Vec3f srcPos(0.f); float afBeta = 0.f; Entity * caster = entities[m_caster]; m_hand_group = caster->obj->fastaccess.primary_attach; if(m_hand_group != ActionPoint()) { ActionPoint group = m_hand_group; m_hand_pos = actionPointPosition(caster->obj, group); } if(m_caster == EntityHandle_Player) { afBeta = player.angle.getYaw(); if(m_hand_group != ActionPoint()) { srcPos = m_hand_pos; } else { srcPos = player.pos; } } else { afBeta = entities[m_caster]->angle.getYaw(); if(m_hand_group != ActionPoint()) { srcPos = m_hand_pos; } else { srcPos = entities[m_caster]->pos; } } srcPos += angleToVectorXZ(afBeta) * 90.f; size_t uiNumber = glm::clamp(static_cast<unsigned int>(m_level), 1u, 5u); for(size_t i = 0; i < uiNumber; i++) { CPoisonProjectile * projectile = new CPoisonProjectile(); m_projectiles.push_back(projectile); } m_duration = GameDurationMs(8000); m_hasDuration = true; GameDuration lMax = 0; for(size_t i = 0; i < m_projectiles.size(); i++) { CPoisonProjectile * projectile = m_projectiles[i]; projectile->Create(srcPos, afBeta + Random::getf(-10.f, 10.f)); GameDuration lTime = m_duration + GameDurationMs(Random::getu(0, 5000)); projectile->SetDuration(lTime); lMax = std::max(lMax, lTime); EERIE_LIGHT * light = dynLightCreate(projectile->lLightId); if(light) { light->intensity = 2.3f; light->fallend = 250.f; light->fallstart = 150.f; light->rgb = Color3f::green; light->pos = projectile->eSrc; light->creationTime = g_gameTime.now(); light->duration = GameDurationMs(200); } } m_duration = lMax + GameDurationMs(1000); }