Exemple #1
0
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);
}