示例#1
0
bool CMoveChecker::checkMove(TDataSetRow entityIndex, sint32& x, sint32& y, uint32 tick)
{
	// setup a refference to the entity's position record, and bomb if it can't be found
	TPositions::iterator positionIt= _Positions.find(entityIndex);
	BOMB_IF(positionIt==_Positions.end(),"Ignoring call to 'checkMove' for an entity who doesn't exist in the move checker",return false);
	SPosition& thePosition= positionIt->second;

	// if the character hasn't moved then just return
	if ( (x==thePosition.X) && (y==thePosition.Y) )
	{
		return true;
	}

//	nlinfo("Checking player move: %s from (%d,%d) @tick: %d to (%d,%d) @tick: %d",
//		entityIndex.toString().c_str(),thePosition.X,thePosition.Y,thePosition.Tick,x,y,tick);

	// if the tick value is out of order (for instance, after an advanced tp request) then ignore the move
	DROP_IF(sint32(tick-thePosition.Tick)<0,"Ignoring out of order move for character "+entityIndex.toString(),return false);

// *** todo: perform a speed test here
// *** todo: perform collision test here 
// *** NOTE: If move not legal then we need to change values of x and y and return false

	// record the new position
	thePosition.X= x;
	thePosition.Y= y;
	thePosition.Tick= tick;

	// generate a few stats
	addStats(entityIndex,x,y,tick);

	return true;
}
示例#2
0
void WorkerActor::DrawDirect(aui_Surface *surf, sint32 x, sint32 y, double scale)
{
	uint16			flags = k_DRAWFLAGS_NORMAL;
	Pixel16			color = 0x0000;
		
	m_unitSpriteGroup->DrawDirect(surf, m_curUnitAction, m_frame, sint32(x+(k_ACTOR_CENTER_OFFSET_X*scale)), sint32(y+(k_ACTOR_CENTER_OFFSET_Y*scale)), m_facing, 
							scale, m_transparency, color, flags, NULL, NULL);
}
示例#3
0
void TradeManager::CreateRoute(aui_Control *control, uint32 action, uint32 uidata, void *cookie)
{
	if(action != AUI_BUTTON_ACTION_EXECUTE) return;

	Assert(s_tradeManager);
	if(!s_tradeManager) return;
	bool breakInstead = sint32(cookie) != 0;
		
//	ctp2_Static *market = (ctp2_Static *)aui_Ldl::GetObject(s_tradeManagerBlock, "Market");
	if(!breakInstead) {
		Assert(s_tradeManager->m_createList);
		if(!s_tradeManager->m_createList) return;

		ctp2_ListItem *item = (ctp2_ListItem *)s_tradeManager->m_createList->GetSelectedItem();
		if(!item) return;

		CreateListData *data = (CreateListData *)item->GetUserData();

		Assert(data);
		if(!data) return;

		Assert(data->m_source.IsValid());
		if(!data->m_source.IsValid()) return;

		Assert(data->m_destination.IsValid());
		if(!data->m_destination.IsValid()) return;

		Assert(g_player[data->m_source.GetOwner()]);
		if(!g_player[data->m_source.GetOwner()]) return;

		g_gevManager->AddEvent(GEV_INSERT_Tail, GEV_SendGood,
							   GEA_Int, data->m_resource,
							   GEA_City, data->m_source,
							   GEA_City, data->m_destination,
							   GEA_End);
	} else {
		
		Assert(s_tradeManager->m_summaryList);
		if(!s_tradeManager->m_summaryList) return;

		ctp2_ListItem *item = (ctp2_ListItem *)s_tradeManager->m_summaryList->GetSelectedItem();
		if(!item) return;

		TradeRoute route((uint32)item->GetUserData());
		Assert(route.IsValid());
		if(!route.IsValid()) return;

		g_gevManager->AddEvent(GEV_INSERT_Tail, GEV_KillTradeRoute,
							   GEA_TradeRoute, route.m_id,
							   GEA_Int, CAUSE_KILL_TRADE_ROUTE_SENDER_KILLED,
							   GEA_End);

		if(g_network.IsClient()) {
			g_network.SendAction(new NetAction(NET_ACTION_CANCEL_TRADE_ROUTE,
											   (uint32)route));
		}
	}
}
sint32 TradeRouteData::GetValue() const
{
	if(m_sourceRouteType != ROUTE_TYPE_RESOURCE)
		return 0;

	double baseValue = g_theWorld->GetGoodValue(m_sourceResource);
	double distance = double(m_destinationCity->GetCityData()->GetDistanceToGood(m_sourceResource));
	return sint32(baseValue * distance);
}
示例#5
0
void Shift(sint8 *map, sint32 sx, sint32 sy,
           sint32 width, sint32 height,
           bool   horiz, sint32 delta, double slope,
           sint32 count, sint32 raiselower)
{
	sint32 s;
	sint32 x = sx, y = sy;
	sint32 ax = x, ay = y;
	for(s = 0; s < count; s++) {
		sint8 old = map[y * width + x];
		if(raiselower > 0) {
			if(old < 127) {
				map[y * width + x]++;
			}
		} else if(raiselower < 0) {
			if(old > -127) {
				map[y * width + x]--;
			}
		}
		if(horiz) {
			ax += delta;
			x += delta;
			while(x >= width) x -= width;
			while(x < 0) x += width;
			y = sint32(sy + (double(ax - sx) * slope));
			while(y >= height) y -= height;
			while(y < 0) y += height;
		} else {
			ay += delta;
			y += delta;
			while(y >= height) y -= height;
			while(y < 0) y += height;

			x = sint32(sx + (double(ay - sy) * slope));
			while(x >= width) x -= width;
			while(x < 0) x += width;
		}
	}
}
示例#6
0
void LineGraph::DrawIndicator(void)
{
	sint32 xpos;
	MBCHAR s[80];

    double xnorm = (m_indicatorValue - m_xmin) / (m_xmax - m_xmin);
	xpos = sint32(m_graphRect.left + xnorm * (m_graphRect.right-m_graphRect.left));

	primitives_DrawLine16(m_surface, xpos, m_graphRect.top + 1,
							xpos, m_graphRect.bottom - 1,
							g_colorSet->GetColor(COLOR_YELLOW));

	sprintf(s, "%#.3f", m_indicatorValue);
	sint32 len = textutils_GetWidth(m_surface, s);
	primitives_DrawText(m_surface, xpos - (len/2), m_graphRect.top+15, s, g_colorSet->GetColorRef(COLOR_YELLOW), TRUE);
}
示例#7
0
Strengths::Strengths(sint32 owner)
{
	m_owner = owner;

	if (g_turn==NULL)
		return;

	sint32 const	curRound = NewTurnCount::GetCurrentRound();

	sint32 c, y;
	for(y = 1; y < curRound; y++) {
		for(c = 0; c < sint32(STRENGTH_CAT_MAX); c++) {
			m_strengthRecords[c].Insert(0);
		}
	}
}
sint32 Squad_Strength::EffectiveRangedStrength() const
{
    sint32 effective_units;
    sint32 range_str;
    if (0 < m_ranged_unit_count) {
        effective_units = int(min(m_unit_count * 0.5, m_ranged_unit_count));

        range_str = sint32(effective_units * m_ranged_str/m_ranged_unit_count);
    }else {
        range_str = 0;
    }




	return range_str;
}
示例#9
0
	// ***************************************************************************
	void CDBViewDigit::draw ()
	{
		CViewRenderer &rVR = *CViewRenderer::getInstance();
		sint32	wDigit= rVR.getFigurTextureW();
		sint32	hDigit= rVR.getFigurTextureH();

		// change bitmap ids
		sint32	val= _Number.getSInt32();
		val= max(val, sint32(0));
		if(_Cache!=val)
		{
			_Cache= val;
			// clamp the value to max possible (eg:99)
			if(val>(sint32)_DivBase-1)
				val=(sint32)_DivBase-1;
			// compute each digit id
			uint	divisor= _DivBase/10;
			for(sint i=0;i<_NumDigit;i++)
			{
				sint digitVal= (val/divisor)%10;
				// set the digit text id
				_DigitId[i]= rVR.getFigurTextureId(digitVal);
				// next divisor
				divisor/= 10;
			}
		}

		// Display bitmaps
		sint32	x= _XReal;
		sint32	y= _YReal;
		for(sint i=0;i<_NumDigit;i++)
		{
			rVR.drawRotFlipBitmap (	_RenderLayer, x, y, wDigit, hDigit, 0, false, _DigitId[i], _Color );
			// next digit
			x+= wDigit+_WSpace;
		}

	}
示例#10
0
void Squad::Add_Agent
(
	AiMain *ai, 
	Agent * add_me
)

{
	#ifdef DBGAILOG
	#ifdef LOG_SQUADS
	if (ai->AI_VERBOSITY > LOG_DETAILS)
	{
		AILOG(( wstr,  "Squad::Add_Agent:\n\tArmyCount() = %d (before).\n", 
				m_squad_strength.GetArmyCount()))
		AILOG(( wstr,  "\tGetUnitCount() = %d (before).\n", 
				m_squad_strength.GetUnitCount()))
		AILOG(( wstr,  "\taddme->GetSquadStrength().GetArmyCount() = %d\n", 
				add_me->GetSquadStrength()->GetArmyCount()))
		AILOG(( wstr,  "\taddme->GetSquadStrength().GetUnitCount() = %d.\n", 
				add_me->GetSquadStrength()->GetUnitCount()))
	}
	#endif
	#endif DBGAILOG

	

    
	add_me->squads_list_cell_ptr = my_agents.Add_Data((data_ptr) add_me);
	add_me->the_squad = this;

    
    m_squad_strength.Add(add_me->GetSquadStrength()); 

	#ifdef DBGAILOG
	#ifdef LOG_SQUADS
	if (ai->AI_VERBOSITY > LOG_DETAILS)
	{
		AILOG(( wstr,  "\tArmyCount() = %d (after).\n", 
				m_squad_strength.GetArmyCount()))
		AILOG(( wstr,  "\tGetUnitCount() = %d (after).\n", 
				m_squad_strength.GetUnitCount()))
	}
	#endif
	#endif DBGAILOG



	
    BOOL will_be_transported = FALSE; 
    MapPointData target_pos, agent_pos; 
    double move_point_cost; 
    double build_time; 
    ArmyAgent *the_army=NULL; 
    CityAgent *the_city=NULL; 
    sint32 dist; 
    if (my_strategic_goal) { 
         *(my_strategic_goal->m_current_attacking_strength) = m_squad_strength;
    

         
         
        ((ArmyGoal*)my_strategic_goal)->GetPos(target_pos); 

         if (add_me->GetType() == AGENT_TYPE_CITY) { 
             the_city = (CityAgent*) add_me; 
             the_city->GetPos(agent_pos); 
             dist = sint32(ai->m_map->WrappedDistance(agent_pos, target_pos)); 
    
         } else { 
             the_army = (ArmyAgent*) add_me; 

             if (the_army->BidDistance(ai, will_be_transported, target_pos, move_point_cost, 
                 dist, build_time) < 0.0) { 
                 dist = 100; 
             }
         }

         if (my_strategic_goal->m_farthest_agent_to_target_dist < dist) { 
             my_strategic_goal->m_farthest_agent_to_target_dist = (sint16) dist; 
         }
    }

	
	m_moveType = 0x0;

	
	Reclassify_Squad(ai, add_me);
}
示例#11
0
void CityAgent::PlacePopMinimumFood(AiMain *ai,
   sint32  &idx_slave, sint32 &remaining_slaves, sint32 &idx_pop,
   sint32 &remaining_pop, const sint32 total_pop,
   TileUtility *open_tile[k_NUM_CITY_TILES], const double foodCoef,
   const double productionCoef, const double max_coef, double &accum_production,
   double &accum_food, const double percent)

{
    sint32 idx_tile;
    sint32 idx_max;
    double max_food;
    sint32 searching = FALSE;
    sint32 needed_food=0;
    BOOL is_unknown_id;
    double f;

    sint32 g = ai->m_will_of_the_people->GetCurrentGov();
    double ration_coef = ai->m_governmentDB->GetRationsCoef(g);
    double ration_unit = ai->m_governmentDB->GetRationsUnit(g);
    double ration_base = ai->m_governmentDB->GetRationsBase(g);
    double ration_level_expected = ai->m_governmentDB->GetRationsExpectation(g);
    double ration_expected = total_pop * (5.0 + 2.5 * (2.0 + ration_level_expected));
    sint32 nf;

    ai->m_population->GetCityRequiredFood(m_id.GetVal(), &nf, &is_unknown_id);





    needed_food = sint32(ceil(percent * double(nf)));

    searching = FALSE;

#ifdef _DEBUG
    sint32 finite_loop=0;
#endif

    while (!searching && (accum_food < needed_food) &&
     ((0 < remaining_slaves) || (0 < remaining_pop))) {

Assert(++finite_loop < 100000);

        max_food = 0.0;
        searching = TRUE;
        idx_max = -1;
        for (idx_tile=0; idx_tile<k_NUM_CITY_TILES; idx_tile++) {
            if (open_tile[idx_tile]) {
                f = open_tile[idx_tile]->m_food * max_coef +
                    open_tile[idx_tile]->m_can_be_irrigated +
                    open_tile[idx_tile]->m_gold +
                    open_tile[idx_tile]->m_production * 0.25 ;

                if (max_food < f) {
                    max_food = f;
                    idx_max = idx_tile;
                    searching = FALSE;
                }
            }
        }

        if (!searching) {
            accum_food += open_tile[idx_max]->m_food;
            accum_production += open_tile[idx_max]->m_production;
            PlaceACitizen(ai, idx_max, idx_slave, remaining_slaves,  idx_pop,
                 remaining_pop, total_pop, open_tile);
        }
    }
}
示例#12
0
BOOL CityAgent::PopNeedsChanging(AiMain *ai, const double food_coef,
    const double prod_coef, const double gold_coef, sint32 idx_city )
{
    BOOL is_unknown_id;




    if (((m_pop_prod > prod_coef) || (m_pop_prod < prod_coef)) ||
        ((m_pop_food > food_coef) || (m_pop_food < food_coef)) ||
        ((m_pop_gold > gold_coef) || (m_pop_gold < gold_coef))) {
        return TRUE;
    }

    if (ai->m_alloc_WGF->IsReset()) {
        return TRUE;
    }

    if (m_pop_needs_changing) {
        return TRUE;
    }

	if (ai->m_population->HasPopGrown(m_id.GetVal(), &is_unknown_id))
		return (TRUE) ;

	if (is_unknown_id)
		return (FALSE) ;

	if (ai->m_population->HasPopStarved(m_id.GetVal(), &is_unknown_id))
		return (TRUE) ;

	if (is_unknown_id)
		return (FALSE) ;

	if (ai->m_population->WasPopExpelled(m_id.GetVal(), &is_unknown_id))
		return (TRUE) ;

	if (is_unknown_id)
		return (FALSE) ;

	if (ai->m_population->WasImprovementBuilt(m_id.GetVal(), &is_unknown_id))
		return (TRUE) ;

	if (is_unknown_id)
		return (FALSE) ;

	if (ai->m_population->WasTerrainImprovementBuilt(m_id.GetVal(), &is_unknown_id))
		return (TRUE) ;

	if (is_unknown_id)
		return (FALSE) ;

	if (ai->m_population->WasHappinessAttacked(m_id.GetVal(), &is_unknown_id))
		return (TRUE) ;

	if (is_unknown_id)
		return (FALSE) ;

	if (ai->m_population->WasTerrainPolluted())
		return (TRUE) ;

    if ((sint32(ai->m_round_count->GetRound()) % 5) == (idx_city % 5))
        return TRUE;

	return (FALSE) ;
}
示例#13
0
AUI_ERRCODE aui_TabGroup::FormatTabs( void )
{
	sint32 numTabs = m_childList->L();

	
	sint32 maxPaneWidth = 0;
	sint32 maxPaneHeight = 0;
	ListPos position = m_childList->GetHeadPosition();
	sint32 i;
	for (i = numTabs; i; i-- )
	{
		aui_Tab *tab = (aui_Tab *)m_childList->GetNext( position );
		if ( tab->GetPane()->Width() > maxPaneWidth )
			maxPaneWidth = tab->GetPane()->Width();
		if ( tab->GetPane()->Height() > maxPaneHeight )
			maxPaneHeight = tab->GetPane()->Height();
	}

	
	sint32 maxTabWidth = 0;
	sint32 maxTabHeight = 0;
	position = m_childList->GetHeadPosition();
	for (sint32 j = numTabs; j > 0; --j)
	{
		aui_Tab *tab = (aui_Tab *)m_childList->GetNext( position );
		if ( tab->Width() > maxTabWidth ) maxTabWidth = tab->Width();
		if ( tab->Height() > maxTabHeight ) maxTabHeight = tab->Height();
	}

	switch ( m_alignment )
	{
	default:
	case AUI_TABGROUP_ALIGNMENT_TOP:
	{
		
		
		sint32 newTabWidth = sint32(0.9 * maxPaneWidth / numTabs + 0.5);

		
		sint32 tabOffset = sint32(0.05 * maxPaneWidth + 0.5);

		
		position = m_childList->GetHeadPosition();
		for ( sint32 k = numTabs; k; k-- )
		{
			aui_Tab *tab = (aui_Tab *)m_childList->GetNext( position );

			if ( m_autoArrange )
			{
				
				tab->Move( tabOffset, 0 );
				tab->Resize( newTabWidth, maxTabHeight );
			}
			else
				tabOffset = tab->X();

			
			tab->GetPane()->Move( -tabOffset, maxTabHeight );
			tab->GetPane()->Resize( maxPaneWidth, maxPaneHeight );
			tab->GetPane()->Offset( m_paneOffsetX, m_paneOffsetY );

			
			tabOffset += newTabWidth;
		}
	}
	break;

	case AUI_TABGROUP_ALIGNMENT_BOTTOM:
	{
		
		
		sint32 newTabWidth = sint32(0.9 * maxPaneWidth / numTabs + 0.5);

		
		sint32 tabOffset = sint32(0.05 * maxPaneWidth + 0.5);

		
		position = m_childList->GetHeadPosition();
		for ( sint32 i = numTabs; i; i-- )
		{
			aui_Tab *tab = (aui_Tab *)m_childList->GetNext( position );

			if ( m_autoArrange )
			{
				
				tab->Move( tabOffset, maxPaneHeight );
				tab->Resize( newTabWidth, maxTabHeight );
			}
			else
				tabOffset = tab->X();

			
			tab->GetPane()->Move( -tabOffset, -maxPaneHeight );
			tab->GetPane()->Resize( maxPaneWidth, maxPaneHeight );
			tab->GetPane()->Offset( m_paneOffsetX, m_paneOffsetY );

			
			tabOffset += newTabWidth;
		}
	}
	break;

	case AUI_TABGROUP_ALIGNMENT_LEFT:
	{
		
		
		sint32 newTabHeight = sint32(0.9 * maxPaneHeight / numTabs + 0.5);

		
		sint32 tabOffset = sint32(0.05 * maxPaneHeight + 0.5);

		
		position = m_childList->GetHeadPosition();
		for (sint32 i = numTabs; i; i-- )
		{
			aui_Tab *tab = (aui_Tab *)m_childList->GetNext( position );

			if ( m_autoArrange )
			{
				
				tab->Move( 0, tabOffset );
				tab->Resize( maxTabWidth, newTabHeight );
			}
			else
				tabOffset = tab->Y();

			
			tab->GetPane()->Move( maxTabWidth, -tabOffset );
			tab->GetPane()->Resize( maxPaneWidth, maxPaneHeight );
			tab->GetPane()->Offset( m_paneOffsetX, m_paneOffsetY );

			
			tabOffset += newTabHeight;
		}
	}
	break;

	case AUI_TABGROUP_ALIGNMENT_RIGHT:
	{
		
		
		sint32 newTabHeight = sint32(0.9 * maxPaneHeight / numTabs + 0.5);

		
		sint32 tabOffset = sint32(0.05 * maxPaneHeight + 0.5);

		
		position = m_childList->GetHeadPosition();
		for (sint32 i = numTabs; i; i-- )
		{
			aui_Tab *tab = (aui_Tab *)m_childList->GetNext( position );

			if ( m_autoArrange )
			{
				
				tab->Move( maxPaneWidth, tabOffset );
				tab->Resize( maxTabWidth, newTabHeight );
			}
			else
				tabOffset = tab->Y();

			
			tab->GetPane()->Move( -maxPaneWidth, -tabOffset );
			tab->GetPane()->Resize( maxPaneWidth, maxPaneHeight );
			tab->GetPane()->Offset( m_paneOffsetX, m_paneOffsetY );

			
			tabOffset += newTabHeight;
		}
	}
	break;
	}
	
	return AUI_ERRCODE_OK;
}
示例#14
0
//----------------------------------------------------------------------------
//
// Name       : DoInstruction
//
// Description: Executes slic intructions that were previously
//              "compiled" by slicif_add_op.
//
// Parameters : SOP op
//
// Globals    : This function is so big no idea.
//
// Returns    : -
//
// Remark(s)  : The behaviour depends on the given SOP type
//              if you define new operatiors you have of course modify
//              or implement the according behaviour of that function.
//
//              This function is called at slic run time.
//
//----------------------------------------------------------------------------
BOOL SlicFrame::DoInstruction(SOP op)
{
	unsigned char* codePtr = &m_segment->m_code[m_offset];
	unsigned char* origCodePtr = &m_segment->m_code[m_offset];
#if defined(SLIC_DOUBLES)
	double dval;
#endif
	
	sint32 ival, ival2; 

	
	SlicStackValue sval1, sval2, sval3;

	SS_TYPE type1, type2, type3;
	SlicSymbolData *symval;
	BOOL stopped = FALSE;
	sint32 sp;
	sint32 res;
	BOOL calcOffset = TRUE;

	//Added by Martin Gühmann for database access
	SlicDBInterface *conduit;
	char* name;

	switch(op) {
		case SOP_PUSHI:
			sval1.m_int = *(reinterpret_cast<sint32 *>(codePtr));
			codePtr += sizeof(sint32);
			m_stack->Push(SS_TYPE_INT, sval1);
			break;

		case SOP_PUSHD:
#if defined(SLIC_DOUBLES)
			dval = *((double*)codePtr);
            // Probably some handling missing here. Now, we just skip some bytes.
#endif
			codePtr += sizeof(sint32);
			break;

		case SOP_PUSHV:
			ival = *((sint32 *)codePtr);
			codePtr += sizeof(int);
			sval1.m_sym = g_slicEngine->GetSymbol(ival);
			if (sval1.m_sym) 
            {
                m_stack->Push(SS_TYPE_SYM, sval1);
            }
            else
            {
				DPRINTF(k_DBG_SLIC, ("Bad mojo, NULL symbol %d\n", ival));
				stopped = TRUE;
			}
			break;

		case SOP_PUSHM:
		{
			ival = *((sint32*)codePtr);
			codePtr += sizeof(sint32);
			symval = g_slicEngine->GetSymbol(ival);
			if(!symval) {
				DPRINTF(k_DBG_SLIC, ("Bad mojo, NULL struct symbol %d\n", ival));
				stopped = TRUE;
				break;
			}

			if(symval->GetType() != SLIC_SYM_STRUCT) {
				DPRINTF(k_DBG_SLIC, ("Bad mojo, %s is not a struct\n", symval->GetName()));
				stopped = TRUE;
				break;
			}

			SlicStructInstance *theStruct = symval->GetStruct();
			Assert(theStruct);

			ival2 = *((sint32*)codePtr);
			codePtr += sizeof(sint32);
			
			sval1.m_sym = theStruct->GetMemberSymbol(ival2);
			m_stack->Push(SS_TYPE_SYM, sval1);
			break;
		}

		case SOP_PUSHAM:
		{
			
			ival = *((sint32*)codePtr);
			codePtr += sizeof(sint32);
			symval = g_slicEngine->GetSymbol(ival);
			if(!symval) {
				DPRINTF(k_DBG_SLIC, ("Bad mojo, NULL struct symbol %d\n", ival));
				stopped = TRUE;
				break;
			}

			if(symval->GetType() != SLIC_SYM_ARRAY) {
				DPRINTF(k_DBG_SLIC, ("Bad mojo, %s is not an array\n", symval->GetName()));
				stopped = TRUE;
				break;
			}

			
			sp = m_stack->Pop(type3, sval3);
			Assert(sp >= 1);
			
			
			sp = m_stack->Pop(type2, sval2);
			Assert(sp >= 0);

			
			if(!symval->ArrayLookup(Eval(type3, sval3), type1, sval1)) {
				DPRINTF(k_DBG_SLIC, ("Couldn't perform array lookup in SOP_PUSHAM\n"));
				stopped = TRUE;
				break;
			}
			
			
			SlicSymbolData * structSym = SlicStack::GetSymbol(type1, sval1);
			if (!structSym) 
            {
				DPRINTF(k_DBG_SLIC, ("Couldn't find struct symbol in SOP_PUSHAM\n"));
				stopped = TRUE;
				break;
			}
			
			if(structSym->GetType() != SLIC_SYM_STRUCT) {
				DPRINTF(k_DBG_SLIC, ("Bad Mojo, array symbol id not a struct in SOP_PUSHAM\n"));
				stopped = TRUE;
				break;
			}

			SlicStructInstance *theStruct = structSym->GetStruct();
			Assert(theStruct);
			
			
			ival2 = *((sint32*)codePtr);
			codePtr += sizeof(sint32);
			
			sval1.m_sym = theStruct->GetMemberSymbol(ival2);
			m_stack->Push(SS_TYPE_SYM, sval1);
			break;
		}

		case SOP_PUSHA:
			ival = *((sint32 *)codePtr);
			codePtr += sizeof(int);
			symval = g_slicEngine->GetSymbol(ival);
			if(!symval) {
				DPRINTF(k_DBG_SLIC, ("Bad mojo, NULL symbol %d\n", ival));
				stopped = TRUE;
				break;
			}

			sval1.m_sym = symval;
			m_stack->Push(SS_TYPE_SYM, sval1);
			break;

		case SOP_AINDX:
			sp = m_stack->Pop(type1, sval1);
			Assert(sp >= 1);
			sp = m_stack->Pop(type2, sval2);
			Assert(sp >= 0);
			res = ArrayLookup(type2, sval2, type1, sval1,
							  type3, sval3);
			if(res)
				
				m_stack->Push(type3, sval3);
			else {
				sval3.m_int = 0;
				
				m_stack->Push(SS_TYPE_INT, sval3);
			}
			break;
		case SOP_ADD:  
			sp = m_stack->Pop(type1, sval1);
			Assert(sp >= 0);
			sp = m_stack->Pop(type2, sval2);
			Assert(sp >= 0);
			sval3.m_int = Eval(type2, sval2) + Eval(type1, sval1);
			
			m_stack->Push(SS_TYPE_INT, sval3);

			break;
		case SOP_SUB:  
			sp = m_stack->Pop(type1, sval1);
			Assert(sp >= 0);
			sp = m_stack->Pop(type2, sval2);
			Assert(sp >= 0);
			sval3.m_int = Eval(type2, sval2) - Eval(type1, sval1);
			m_stack->Push(SS_TYPE_INT, sval3);

			break;
		case SOP_MULT: 
			sp = m_stack->Pop(type1, sval1);
			Assert(sp >= 0);
			sp = m_stack->Pop(type2, sval2);
			Assert(sp >= 0);
			sval3.m_int = Eval(type2, sval2) * Eval(type1, sval1);
			m_stack->Push(SS_TYPE_INT, sval3);

			break;
		case SOP_EXP: 
			sp = m_stack->Pop(type1, sval1);
			Assert(sp >= 0);
			sp = m_stack->Pop(type2, sval2);
			Assert(sp >= 0);
			sval3.m_int = static_cast<int>
				(pow(static_cast<double>(Eval(type2, sval2)), Eval(type1, sval1)));
			m_stack->Push(SS_TYPE_INT, sval3);
			break;
		// Bitwise operators:
		case SOP_BAND: 
			sp = m_stack->Pop(type1, sval1);
			Assert(sp >= 0);
			sp = m_stack->Pop(type2, sval2);
			Assert(sp >= 0);
			sval3.m_int = Eval(type2, sval2) & Eval(type1, sval1);
			m_stack->Push(SS_TYPE_INT, sval3);
			break;
		case SOP_BOR:
			sp = m_stack->Pop(type1, sval1);
			Assert(sp >= 0);
			sp = m_stack->Pop(type2, sval2);
			Assert(sp >= 0);
			sval3.m_int = Eval(type2, sval2) | Eval(type1, sval1);
			m_stack->Push(SS_TYPE_INT, sval3);
			break;
		case SOP_BXOR:
			sp = m_stack->Pop(type1, sval1);
			Assert(sp >= 0);
			sp = m_stack->Pop(type2, sval2);
			Assert(sp >= 0);
			sval3.m_int = Eval(type2, sval2) ^ Eval(type1, sval1);
			m_stack->Push(SS_TYPE_INT, sval3);
			break;
		case SOP_BNOT:
			sp = m_stack->Pop(type1, sval1);
			Assert(sp >= 0);
			sval3.m_int = ~Eval(type1, sval1);
			m_stack->Push(SS_TYPE_INT, sval3);
			break;
		case SOP_DIV:  
			sp = m_stack->Pop(type1, sval1);
			Assert(sp >= 0);
			sp = m_stack->Pop(type2, sval2);
			Assert(sp >= 0);
			if(Eval(type1, sval1) == 0) {

				//Added by Martin Gühmann
				//It is a problem of slic code and not of the ctp2.exe,
				//the slicer has to solve the problem.
				if(g_theProfileDB && g_theProfileDB->IsDebugSlic()) {
					c3errors_ErrorDialog("Slic", "In object %s: Division by 0.", m_segment->GetName());
				}
				sval3.m_int = 0;
				m_stack->Push(SS_TYPE_INT, sval3);
				break;
			}
			sval3.m_int = Eval(type2, sval2) / Eval(type1, sval1);
			m_stack->Push(SS_TYPE_INT, sval3);

			break;
		case SOP_MOD:  
			sp = m_stack->Pop(type1, sval1);
			Assert(sp >= 0);
			sp = m_stack->Pop(type2, sval2);
			Assert(sp >= 0);
            {
                sint32 const    divisor = Eval(type1, sval1);
                if (0 == divisor)
                {
                    // Handle error as for SOP_DIV.
                    if (g_theProfileDB && g_theProfileDB->IsDebugSlic())
                    {
                        c3errors_ErrorDialog("Slic", "In object %s: modulo 0.",
                                             m_segment->GetName()
                                            );
                    }
                    sval3.m_int = 0;
                }
                else
                {
                    sval3.m_int = Eval(type2, sval2) % divisor;
                }
            }
			m_stack->Push(SS_TYPE_INT, sval3);

			break;
		case SOP_EQ:   
			sp = m_stack->Pop(type1, sval1);
			Assert(sp >= 0);
			sp = m_stack->Pop(type2, sval2);
			Assert(sp >= 0);
			sval3.m_int = IsEqual(type2, sval2, type1, sval1);
			
			m_stack->Push(SS_TYPE_INT, sval3);

			break;
		case SOP_GT:   
			sp = m_stack->Pop(type1, sval1);
			Assert(sp >= 0);
			sp = m_stack->Pop(type2, sval2);
			Assert(sp >= 0);
			sval3.m_int = Eval(type2, sval2) > Eval(type1, sval1);
			m_stack->Push(SS_TYPE_INT, sval3);

			break;
		case SOP_LT:   
			sp = m_stack->Pop(type1, sval1);
			Assert(sp >= 0);
			sp = m_stack->Pop(type2, sval2);
			Assert(sp >= 0);
			sval3.m_int = Eval(type2, sval2) < Eval(type1, sval1);
			m_stack->Push(SS_TYPE_INT, sval3);

			break;
		case SOP_GTE:  

			sp = m_stack->Pop(type1, sval1);
			Assert(sp >= 0);
			sp = m_stack->Pop(type2, sval2);
			Assert(sp >= 0);
			sval3.m_int = Eval(type2, sval2) >= Eval(type1, sval1);
			m_stack->Push(SS_TYPE_INT, sval3);

			break;
		case SOP_LTE:  

			sp = m_stack->Pop(type1, sval1);
			Assert(sp >= 0);
			sp = m_stack->Pop(type2, sval2);
			Assert(sp >= 0);
			sval3.m_int = Eval(type2, sval2) <= Eval(type1, sval1);
			m_stack->Push(SS_TYPE_INT, sval3);

			break;
		case SOP_NEQ:
			
			sp = m_stack->Pop(type1, sval1);
			Assert(sp >= 0);
			sp = m_stack->Pop(type2, sval2);
			Assert(sp >= 0);
			sval3.m_int = !IsEqual(type2, sval2, type1, sval1);
			m_stack->Push(SS_TYPE_INT, sval3);

			break;
		case SOP_AND:
			sp = m_stack->Pop(type1, sval1);
			Assert(sp >= 0);
			sp = m_stack->Pop(type2, sval2);
			Assert(sp >= 0);
			sval3.m_int = Eval(type2, sval2) && Eval(type1, sval1);
			m_stack->Push(SS_TYPE_INT, sval3);

			break;
		case SOP_OR:
			sp = m_stack->Pop(type1, sval1);
			Assert(sp >= 0);
			sp = m_stack->Pop(type2, sval2);
			Assert(sp >= 0);
			sval3.m_int = Eval(type2, sval2) || Eval(type1, sval1);
			m_stack->Push(SS_TYPE_INT, sval3);

			break;
		case SOP_NOT:
			sp = m_stack->Pop(type1, sval1);
			Assert(sp >= 0);
			sval3.m_int = !Eval(type1, sval1);
			m_stack->Push(SS_TYPE_INT, sval3);
			break;
		case SOP_POP:  
			
			
			Assert(FALSE);
			break;
		case SOP_TRIG: 
			sp = m_stack->Pop(type1, sval1);
			Assert(sp >= 0);
			sval3.m_int = Eval(type1, sval1);
			if(!sval3.m_int)
				stopped = TRUE;
			break;
		case SOP_ARGE: 
			sp = m_stack->Pop(type1, sval1);			
			AddArg(type1, sval1);
			break;
		case SOP_ARGID:
			ival = *((sint32 *)codePtr);
			codePtr += sizeof(sint32);
			symval = g_slicEngine->GetSymbol(ival);
			if(!symval) {
				DPRINTF(k_DBG_SLIC, ("Bad Mojo, NULL symbol %d\n", ival));
				return FALSE;
			}
			if(symval->GetType() != SLIC_SYM_ID) {
				DPRINTF(k_DBG_SLIC, ("Bad Mojo, symbol %s is not of type ID\n",
						symval->GetName()));
				return FALSE;
			}
			m_argList->AddArg(symval->GetSegment(), symval);
			break;
		case SOP_ARGS: 
			ival = *((sint32 *)codePtr);
			codePtr += sizeof(sint32);
			symval = g_slicEngine->GetSymbol(ival);
			if(symval->GetType() != SLIC_SYM_SVAR) {
				DPRINTF(k_DBG_SLIC, ("Bad Mojo, string arg doesn't have string type\n"));
				return FALSE;
			}
			m_argList->AddArg(SA_TYPE_STRING, sint32(symval->GetStringId()));
			break;
		case SOP_ARGST:
			ival = *((sint32 *)codePtr);
			codePtr += sizeof(sint32);
			symval = g_slicEngine->GetSymbol(ival);
			if(symval->GetType() != SLIC_SYM_STRING) {
				DPRINTF(k_DBG_SLIC, ("Bad Mojo, hard string doesn't have hard string type\n"));
				return FALSE;
			}
			m_argList->AddArg(SA_TYPE_HARD_STRING, symval);
			break;
		case SOP_CALL:
		case SOP_CALLR:
		{
			
			ival = *((sint32 *)codePtr);
			codePtr += sizeof(sint32);
			symval = g_slicEngine->GetSymbol(ival);
			if(!symval) {
				DPRINTF(k_DBG_SLIC, ("Bad Mojo, NULL symbol %d\n", ival));
				return FALSE;
			}
			if(symval->GetType() != SLIC_SYM_FUNC && symval->GetType() != SLIC_SYM_UFUNC) {
				DPRINTF(k_DBG_SLIC, ("Bad Mojo, symbol %s is not a function\n",
						symval->GetName()));
				return FALSE;
			}
			SlicFunc *funcObj = symval->GetFunction();
			SFN_ERROR err;

			if(!funcObj) {
				
				SlicSegment *segment = g_slicEngine->GetSegment(symval->GetName());
				if(!segment || segment->GetType() != SLIC_OBJECT_FUNCTION) {
					DPRINTF(k_DBG_SLIC, ("Undefined function %s\n", symval->GetName()));
					if(g_theProfileDB && g_theProfileDB->IsDebugSlic()) {
						c3errors_ErrorDialog("Slic", "%s is not a known function", symval->GetName());
					}
					return FALSE;
				}
				
				
				SlicObject * obj = NULL;
				err = segment->Call(m_argList, obj);
				if (obj)
                {
                    if (op == SOP_CALLR) 
                    {
					    if (g_slicEngine->AtBreak()) 
                        {
                            Assert(!m_resultObject); // need stack when failing?
                            if (m_resultObject)
                            {
                                m_resultObject->Release();
                            }
						    m_resultObject  = obj;
					    } 
                        else 
                        {
						    sval1.m_int = obj->GetResult();
						    m_stack->Push(SS_TYPE_INT, sval1);
						    obj->Release();
					    }
                    }
                    else 
                    {
                        // SOP_CALL: result not used
                        obj->Release();
                    }
				}
			} else {
				err = funcObj->Call(m_argList);
				if(op == SOP_CALLR) {
					switch(funcObj->GetReturnType()) {
						case SFR_INT:
							sval1.m_int = funcObj->GetResult().m_int;
							m_stack->Push(SS_TYPE_INT, sval1);
							break;
						default:
							sval1.m_int = 0;
							m_stack->Push(SS_TYPE_INT, sval1);
							Assert(FALSE);
					}
				}
			}
			if(err != SFN_ERROR_OK) {
				ReportSFError(err, symval);
				stopped = TRUE;
			}

			
			m_argStackPtr--;
			Assert(m_argStackPtr >= -1);
			if(m_argStackPtr >= 0) {
				m_argList = &m_argListArray[m_argStackPtr];
			} else if(m_argStackPtr == -1) {
				m_argList = NULL;
			}

			if(g_slicEngine->AtBreak())
				stopped = TRUE;

			break;
		}
		case SOP_EVENT:
		{
			ival = *((sint32 *)codePtr);
			codePtr += sizeof(sint32);
			if(g_gevManager->IsProcessing()) {
				EVENTLOG(("    "));
			}

			EVENTLOG(("Event:%s(", g_gevManager->GetEventName((GAME_EVENT)ival)));

			GameEventArgList *args = m_argList->CreateGameEventArgs((GAME_EVENT)ival);
			EVENTLOG((") : Serial %d\n", g_gevManager->GetNextSerial()));

			g_gevManager->ArglistAddEvent(GEV_INSERT_Tail,
										  (GAME_EVENT)ival,
										  args);
			
			
			m_argStackPtr--;
			Assert(m_argStackPtr >= -1);
			if(m_argStackPtr >= 0) {
				m_argList = &m_argListArray[m_argStackPtr];
			} else if(m_argStackPtr == -1) {
				m_argList = NULL;
			}

			if(g_slicEngine->AtBreak())
				stopped = TRUE;

			break;
		}
		case SOP_SBLK:
			DPRINTF(k_DBG_SLIC, ("dangling SBLK\n"));
			return FALSE;
		case SOP_END:
			stopped = TRUE;
			codePtr += sizeof(sint32); 
			break;
		case SOP_JMP:
			m_offset    = *(reinterpret_cast<sint32 *>(codePtr));
			calcOffset  = FALSE;
			break;
		case SOP_BNT:
			ival = *((sint32 *)codePtr);
			codePtr += sizeof(sint32);
			sp = m_stack->Pop(type2, sval2);
			if(!Eval(type2, sval2)) {
				m_offset = ival;
				calcOffset = FALSE;
			}
			break;
		case SOP_BNEV:
			
			
			
			codePtr += sizeof(sint32);
			
			break;
		case SOP_BUTN:
			ival = *((sint32 *)codePtr);
			codePtr += sizeof(sint32);
			ival2 = *((sint32 *)codePtr);
			codePtr += sizeof(sint32);

			symval = g_slicEngine->GetSymbol(ival2);
			if(symval->GetType() != SLIC_SYM_SVAR) {
				DPRINTF(k_DBG_SLIC, ("Bad Mojo, button string arg doesn't have string type\n"));
				return FALSE;
			}
			g_slicEngine->GetContext()->AddButton(new SlicButton(
				(StringId)symval->GetStringId(), m_segment,
				ival, g_slicEngine->GetContext()));
			break;
		case SOP_OCLS:
			ival = *((sint32 *)codePtr);
			codePtr += sizeof(sint32);

			g_slicEngine->GetContext()->AddButton(new SlicButton(
					 		 -1, m_segment, ival,
							 g_slicEngine->GetContext()));
			break;
		case SOP_STOP:
			stopped = TRUE;
			break;
		case SOP_NEG:
			sp = m_stack->Pop(type1, sval1);
			Assert(sp >= 0);
			sval3.m_int = 0 - Eval(type1, sval1);
			m_stack->Push(SS_TYPE_INT, sval3);
			break;
		case SOP_ASSN:
			ival = *((sint32*)codePtr);
			codePtr += sizeof(sint32);

			symval = g_slicEngine->GetSymbol(ival);
			if(!symval) {
				DPRINTF(k_DBG_SLIC, ("Bad mojo, NULL symbol %d\n", ival));
				stopped = TRUE;
				break;
			}

			sp = m_stack->Pop(type1, sval1);
			
			
			SetValue(symval, type1, sval1);
			break;
		case SOP_ASSNA:
			
			ival = *((sint32 *)codePtr);
			codePtr += sizeof(sint32);
			symval = g_slicEngine->GetSymbol(ival);
			if(!symval) {
				DPRINTF(k_DBG_SLIC, ("Bad mojo, NULL symbol %d in array assignment", ival));
				stopped = TRUE;
				break;
			}

			if(symval->GetType() != SLIC_SYM_ARRAY) {
				if(g_theProfileDB && g_theProfileDB->IsDebugSlic()) {
					c3errors_ErrorDialog("Slic", "Symbol '%s' used in array assignment is not an array", symval->GetName());
				}
				stopped = TRUE;
				break;
			}

			
			sp = m_stack->Pop(type2, sval2);
			Assert(sp >= 1);

			
			sp = m_stack->Pop(type3, sval3);
			Assert(sp >= 0);
			
			SetArrayValue(symval, type2, sval2, type3, sval3);
			break;
		case SOP_ASSNM:
		{
			ival = *((sint32*)codePtr);
			codePtr += sizeof(sint32);
			symval = g_slicEngine->GetSymbol(ival);
			if(!symval) {
				DPRINTF(k_DBG_SLIC, ("Bad mojo, NULL struct symbol %d\n", ival));
				stopped = TRUE;
				break;
			}

			if(symval->GetType() != SLIC_SYM_STRUCT) {
				DPRINTF(k_DBG_SLIC, ("Bad mojo, %s is not a struct\n", symval->GetName()));
				stopped = TRUE;
				break;
			}

			SlicStructInstance *theStruct = symval->GetStruct();
			Assert(theStruct);

			ival2 = *((sint32*)codePtr);
			codePtr += sizeof(sint32);
			
			symval = theStruct->GetMemberSymbol(ival2);
			
			sp = m_stack->Pop(type1, sval1);
			Assert(sp >= 0);
			SetValue(symval, type1, sval1);
			break;
		}
		case SOP_ASSNAM:
		{
			

			
			ival = *((sint32 *)codePtr);
			codePtr += sizeof(sint32);
			SlicSymbolData *arraySym = g_slicEngine->GetSymbol(ival);

			
			ival2 = *((sint32 *)codePtr);
			codePtr += sizeof(sint32);
			
			if(!arraySym) {
				DPRINTF(k_DBG_SLIC, ("Bad Mojo, symbol %d does not exist", ival));
				stopped = TRUE;
				break;
			}

			if(arraySym->GetType() != SLIC_SYM_ARRAY) {
				DPRINTF(k_DBG_SLIC, ("%s is not an array", arraySym->GetName()));
				stopped = TRUE;
				break;
			}

			
			sp = m_stack->Pop(type1, sval1);
			Assert(sp >= 1);

			
			sp = m_stack->Pop(type2, sval2);
			Assert(sp >= 0);

			if(!arraySym->ArrayLookup(Eval(type2, sval2), type3, sval3)) {
				DPRINTF(k_DBG_SLIC, ("Array lookup, %s[%d], failed\n", 
									 arraySym->GetName(), Eval(type2, sval2)));
				stopped = TRUE;
				break;
			}

			SlicSymbolData *structSym = SlicStack::GetSymbol(type3, sval3);
			if (!structSym) 
			{
				DPRINTF(k_DBG_SLIC, ("Couldn't find symbol for %s[%d]\n",
									 arraySym->GetName(), Eval(type2, sval2)));
				stopped = TRUE;
				break;
			}

			if(structSym->GetType() != SLIC_SYM_STRUCT) {
				DPRINTF(k_DBG_SLIC, ("%s[%d] is not a struct\n",
									 arraySym->GetName(), Eval(type2, sval2)));
				stopped = TRUE;
				break;
			}

			SlicStructInstance *theStruct = structSym->GetStruct();
			Assert(theStruct);

			if(!theStruct) {
				stopped = TRUE;
				break;
			}
			SlicSymbolData *assnSym = theStruct->GetMemberSymbol(ival2);
			assnSym->SetValueFromStackValue(type1, sval1);
			break;
		}			
		case SOP_SARGS:
			
			m_argStackPtr++;
			Assert(m_argStackPtr < k_ARGLIST_STACK_SIZE);
			if(m_argStackPtr < k_ARGLIST_STACK_SIZE) {
				m_argList = &m_argListArray[m_argStackPtr];
				m_argList->Clear();
			}
			break;
		case SOP_RET:
			
			sp = m_stack->Pop(type1, sval1);
			Assert(sp >= 0);
			g_slicEngine->GetContext()->SetResult(Eval(type1, sval1));
			stopped = TRUE;
			break;
		case SOP_LINE:
		case SOP_LBRK:
		{
			
			ival = *((sint32 *)codePtr);
			codePtr += sizeof(sint32);
			m_currentLine = ival;

			ival2 = *((sint32 *)codePtr);
			if(m_segment->GetFilename()) {
				if(ival2 < 0) {
					
					
					*((sint32 *)codePtr) = FindFileOffset(m_segment->GetFilename(), ival);
					ival2 = *((sint32 *)codePtr);
				}
			}

			codePtr += sizeof(sint32);

			SlicConditional *cond = *((SlicConditional **)codePtr);
			codePtr += sizeof(SlicConditional *);

			if(op == SOP_LBRK || g_slicEngine->BreakRequested()) {
				if(!cond || (cond->Eval() != 0)) {
					
					
					g_slicEngine->Break(m_segment, codePtr - m_segment->m_code, 
										g_slicEngine->GetContext(), m_stack,
										m_messageData);
					stopped = TRUE;
				}
			}

			break;
		}
		case SOP_ASIZE:
			ival = *((sint32 *)codePtr);
			codePtr += sizeof(sint32);
			symval = g_slicEngine->GetSymbol(ival);
			Assert(symval);
			if(symval) {
				sval1.m_int = symval->GetArray()->GetSize();
			}
			else{
				sval1.m_int = 0;
			}
			m_stack->Push(SS_TYPE_INT, sval1);
			break;

		//Added by Martin Gühmann for database support
		case SOP_DBNAME:
		{
			conduit     = GetDatabase(codePtr);
			ival        = *((sint32 *)codePtr);
			codePtr    += sizeof(sint32);
			symval      = g_slicEngine->GetSymbol(ival);

			if (conduit && symval) 
            {
			    sval1.m_sym = symval;
			    sval3.m_int = Eval(SS_TYPE_SYM, sval1);		
			
			    if ((sval3.m_int >= 0) && sval3.m_int < conduit->GetNumRecords())
                {	
                    // No action: value is OK
			    }
			    else
                {
				    sval3.m_int = -1;
                }
                
                m_stack->Push(SS_TYPE_INT, sval3);
			}
            else
            {
				DPRINTF(k_DBG_SLIC, ("Bad mojo, NULL symbol %d\n", ival));
				stopped = TRUE;
			}
			break;
		}
		case SOP_DBNAMEREF:
		{
			conduit     = GetDatabase(codePtr);
			ival        = *((sint32 *)codePtr);
			codePtr    += sizeof(sint32);
			symval      = g_slicEngine->GetSymbol(ival);

			if (conduit && symval) 
            {
                //Get the member:
                name = reinterpret_cast<char *>(codePtr);
                Assert(name);
                for ( ; *codePtr++; )
                {
	                // No action: just skip
                }

                sval1.m_sym = symval;
                sval3.m_int = Eval(SS_TYPE_SYM, sval1);		

                if(sval3.m_int > -1 && sval3.m_int < conduit->GetNumRecords()){		
	                sval3.m_int = conduit->GetValue(sval3.m_int, name);
	                m_stack->Push(SS_TYPE_INT, sval3);
                }
                else{
	                if(g_theProfileDB && g_theProfileDB->IsDebugSlic()) {
		                c3errors_ErrorDialog("Slic", "In object %s no entry found with index %i in %s.", m_segment->GetName(), sval3.m_int, conduit->GetName());
	                }
	                sval3.m_int = 0;
	                m_stack->Push(SS_TYPE_INT, sval3);
                }
            }
            else
            {
				DPRINTF(k_DBG_SLIC, ("Bad mojo, NULL symbol %d\n", ival));
				stopped = TRUE;
            }
			break;
		}
		case SOP_DBNAMEARRAY:
		{
			conduit     = GetDatabase(codePtr);
			ival        = *((int*)codePtr);
			codePtr    += sizeof(int);
			symval      = g_slicEngine->GetSymbol(ival);

			if (conduit && symval) 
            {
			    //Get the member:
			    name    = reinterpret_cast<char *>(codePtr);
			    Assert(name);
			    for ( ; *codePtr++ ; )
                {
				    // No action: just skip
			    }

			    sval1.m_sym = symval;
			    sval3.m_int = Eval(SS_TYPE_SYM, sval1);		

			    sp = m_stack->Pop(type2, sval2);
			    Assert(sp >= 0);

			    sval2.m_int = Eval(type2, sval2);

			    if(sval3.m_int > -1 && sval3.m_int < conduit->GetNumRecords()){		
				    sval3.m_int = conduit->GetValue(sval3.m_int, name, sval2.m_int);
				    m_stack->Push(SS_TYPE_INT, sval3);
			    }
			    else{
				    if(g_theProfileDB && g_theProfileDB->IsDebugSlic()) {
					    c3errors_ErrorDialog("Slic", "In object %s no entry found with index %i in %s.", m_segment->GetName(), sval3.m_int, conduit->GetName());
				    }
				    sval3.m_int = 0;
				    m_stack->Push(SS_TYPE_INT, sval3);
			    }
            }
            else
            {
				DPRINTF(k_DBG_SLIC, ("Bad mojo, NULL symbol %d\n", ival));
				stopped = TRUE;
			}

			break;
		}
		case SOP_DBNAMECONSTARRAY:
		{
			conduit     = GetDatabase(codePtr);

            if (conduit)
            {
			    sval3.m_int = *((sint32 *)codePtr);
			    codePtr    += sizeof(sint32);
			    //Get the member:
			    name = reinterpret_cast<char *>(codePtr);
			    Assert(name);
			    for ( ; *codePtr++; )
                {
				    // No action: just skip
			    }

			    sp = m_stack->Pop(type2, sval2);
			    Assert(sp >= 0);

			    sval2.m_int = Eval(type2, sval2);


			    if(sval3.m_int > -1 && sval3.m_int < conduit->GetNumRecords()){		
				    sval3.m_int = conduit->GetValue(sval3.m_int, name, sval2.m_int);
				    m_stack->Push(SS_TYPE_INT, sval3);
			    }
			    else{
				    if(g_theProfileDB && g_theProfileDB->IsDebugSlic()) {
					    c3errors_ErrorDialog("Slic", "In object %s no entry found with index %i in %s.", m_segment->GetName(), sval3.m_int, conduit->GetName());
				    }
				    sval3.m_int = 0;
				    m_stack->Push(SS_TYPE_INT, sval3);
			    }
            }
            else
            {
				DPRINTF(k_DBG_SLIC, ("Bad mojo, incorrect database symbol\n"));
				stopped = TRUE;
            }

			break;
		}
		case SOP_DB:
		{
			conduit = GetDatabase(codePtr);

			if (conduit)
            {
			    sp = m_stack->Pop(type1, sval1);
			    Assert(sp >= 0);

			    sval3.m_int = Eval(type1, sval1);

			    if(sval3.m_int > -1 && sval3.m_int < conduit->GetNumRecords()){		
				    m_stack->Push(SS_TYPE_INT, sval3);
			    }
			    else{
				    sval3.m_int = -1;
				    m_stack->Push(SS_TYPE_INT, sval3);
			    }
            }
            else
            {
				DPRINTF(k_DBG_SLIC, ("Bad mojo, incorrect database symbol\n"));
				stopped = TRUE;
            }

			break;
		}
		case SOP_DBREF:
		{
			conduit = GetDatabase(codePtr);

			if (conduit)
            {
			    //Get the member:
			    name = reinterpret_cast<char *>(codePtr);
			    Assert(name);
			    for ( ; *codePtr++ ; )
                {
				    // No action: just skip
			    }

			    sp = m_stack->Pop(type1, sval1);
			    Assert(sp >= 0);

			    sval2.m_int = Eval(type1, sval1);

			    if(sval2.m_int > -1 && sval2.m_int < conduit->GetNumRecords()){		
				    sval3.m_int = conduit->GetValue(sval2.m_int, name);
				    m_stack->Push(SS_TYPE_INT, sval3);
			    }
			    else{
				    if(g_theProfileDB && g_theProfileDB->IsDebugSlic()) {
					    c3errors_ErrorDialog("Slic", "In object %s no entry found with index %i in %s.", m_segment->GetName(), sval2.m_int, conduit->GetName());
				    }
				    sval2.m_int = 0;
				    m_stack->Push(SS_TYPE_INT, sval2);
			    }
            }
            else
            {
				DPRINTF(k_DBG_SLIC, ("Bad mojo, incorrect database symbol\n"));
				stopped = TRUE;
            }

			break;
		}
		case SOP_DBARRAY:
		{
			conduit = GetDatabase(codePtr);

			if (conduit)
            {
			    //Get the member:
			    name = reinterpret_cast<char *>(codePtr);
			    Assert(name);
			    for ( ; *codePtr++; )
                {
				    // Just skip
			    }

			    sp = m_stack->Pop(type1, sval1);
			    Assert(sp >= 0);

			    sval1.m_int = Eval(type1, sval1);

			    sp = m_stack->Pop(type2, sval2);
			    Assert(sp >= 0);

			    sval2.m_int = Eval(type2, sval2);

			    if(sval2.m_int > -1 && sval2.m_int < conduit->GetNumRecords()){		
				    sval3.m_int = conduit->GetValue(sval2.m_int, name, sval1.m_int);
				    m_stack->Push(SS_TYPE_INT, sval3);
			    }
			    else{
				    if(g_theProfileDB && g_theProfileDB->IsDebugSlic()) {
					    c3errors_ErrorDialog("Slic", "In object %s no entry found with index %i in %s.", m_segment->GetName(), sval2.m_int, conduit->GetName());
				    }
				    sval2.m_int = 0;
				    m_stack->Push(SS_TYPE_INT, sval2);
			    }
            }
            else
            {
				DPRINTF(k_DBG_SLIC, ("Bad mojo, incorrect database symbol\n"));
				stopped = TRUE;
            }
            
			break;
		}
		case SOP_DBSIZE:
		{
			//Added by Martin Gühmann to figure out via 
			//slic how many records the database contains
			//Get the database:
			conduit = GetDatabase(codePtr);
			Assert(conduit);
			if (conduit)
            {
				sval3.m_int = conduit->GetNumRecords();
			}
			else
            {
				sval3.m_int = 0;
			}
			m_stack->Push(SS_TYPE_INT, sval3);
			break;
		}

		default:
			DPRINTF(k_DBG_SLIC, ("???\n"));
			break;
	}
	if(calcOffset)
		m_offset += codePtr - origCodePtr;
	return !stopped;
}
示例#15
0
void gslog_LogPlayerStats(sint32 player)
{
#ifndef _BFR_
	if(!g_theProfileDB->GetEnableLogs())
		return;

	Player *pl = g_player[player];

	if (!pl) return;


	gslog_print("[Player %d] [Turn %d]\n", player, pl->m_current_round);


	sint32 totalFood = 0, totalFoodCrime = 0, totalFoodConsumed = 0;

	UnitDynamicArray *cityList = pl->GetAllCitiesList();
	sint32 cityIndex;


	for (cityIndex = 0; cityIndex < cityList->Num(); cityIndex++)
    {
		CityData * cityData = (*cityList)[cityIndex].GetData()->GetCityData();

		sint32 foodCrime = 0;
		cityData->GetFoodCrime(foodCrime);

		totalFood           += cityData->GetGrossCityFood();
		totalFoodCrime      += foodCrime;
		totalFoodConsumed   += static_cast<sint32>(cityData->GetConsumedFood());
	}

	sint32 percentFoodCrime = totalFood ?
		((totalFoodCrime * 100) / totalFood) : 0;
	sint32 percentFoodConsumed = totalFood ?
		((totalFoodConsumed * 100) / totalFood) : 0;
	sint32 percentFoodStored = 100 - (percentFoodCrime + percentFoodConsumed);

	gslog_print("  Food Total: %d\n", totalFood);
	gslog_print("  Food Crime: %d (%d%%):\n", totalFoodCrime, percentFoodCrime);
	gslog_print("  Food Consumed: %d (%d%%)\n", totalFoodConsumed, percentFoodConsumed);
	gslog_print("  Food Stored: %d (%d%%)\n", totalFood - (totalFoodConsumed + totalFoodCrime), percentFoodStored);


	sint32 totalProduction = 0, totalProductionCrime = 0,
		totalProductionUnitUpkeep = 0, totalProductionPublicWorks = 0;




	for (cityIndex = 0; cityIndex < cityList->Num(); cityIndex++)
    {
		CityData *cityData = (*cityList)[cityIndex].GetData()->GetCityData();

		totalProduction             += cityData->GetGrossCityProduction();
		totalProductionCrime        += cityData->GetProdCrime();
		totalProductionPublicWorks  += cityData->ComputeMaterialsPaid(pl->m_materialsTax);
	}

	totalProductionUnitUpkeep = pl->GetReadinessCost();

	sint32 percentProductionCrime = totalProduction ?
		((totalProductionCrime * 100) / totalProduction) : 0;
	sint32 percentProductionUnitUpkeep = totalProduction ?
		((totalProductionUnitUpkeep * 100) / totalProduction) : 0;
	sint32 percentProductionPublicWorks = totalProduction ?
		((totalProductionPublicWorks * 100) / totalProduction) : 0;
#if 0   // Unused
	sint32 percentProductionCityUse = 100 - (percentProductionCrime +
		percentProductionUnitUpkeep + totalProductionPublicWorks);
#endif

	gslog_print("  Total Production: %d\n", totalProduction);
	gslog_print("  Production Crime: %d (%d%%)\n", totalProductionCrime, percentProductionCrime);
	gslog_print("  Production Unit Upkeep: %d (%d%%)\n", totalProductionUnitUpkeep, percentProductionUnitUpkeep);
	gslog_print("  Production PW: %d (%d%%)\n", totalProductionPublicWorks, percentProductionPublicWorks);

	sint32 totalCommerce = 0, totalCommerceCrime = 0,
		totalCommerceWages = 0, totalCommerceBuildingUpkeep = 0,
		totalCommerceScience = 0, totalTrade = 0;


	sint32  wonderReduction = wonderutil_GetDecreaseMaintenance(pl->GetBuiltWonders());
	for (cityIndex = 0; cityIndex < cityList->Num(); cityIndex++)
	{
		CityData *cityData = (*cityList)[cityIndex].GetData()->GetCityData();

		sint32 commerceBuildingUpkeep = buildingutil_GetTotalUpkeep
		    (cityData->GetImprovements(), wonderReduction, cityData->GetOwner()); //EMOD added owner

		totalCommerce               += cityData->GetGrossCityGold();
		totalCommerceCrime          += cityData->GetTradeCrime();
		totalCommerceWages          += cityData->CalcWages();
		totalCommerceBuildingUpkeep += commerceBuildingUpkeep;
		totalCommerceScience        += cityData->GetScience();
		totalTrade                  += cityData->GetNetCityGold();
	}

	sint32 percentCommerceCrime = totalCommerce ?
		((totalCommerceCrime * 100) / totalCommerce) : 0;
	sint32 percentCommerceWages = totalCommerce ?
		((totalCommerceWages * 100) / totalCommerce) : 0;
	sint32 percentCommerceBuildingUpkeep = totalCommerce ?
		((totalCommerceBuildingUpkeep * 100) / totalCommerce) : 0;
	sint32 percentCommerceScience = totalCommerce ?
		((totalCommerceScience * 100) / totalCommerce) : 0;
	sint32 percentCommerceSavings = 100 - (percentCommerceCrime +
		percentCommerceWages + percentCommerceBuildingUpkeep +
		percentCommerceScience);

	gslog_print("  Total Commerce: %d\n", totalCommerce);
	gslog_print("  Total Commerce After Science: %d\n", totalCommerce - totalCommerceScience);
	gslog_print("  Commerce Crime: %d (%d%%)\n", totalCommerceCrime, percentCommerceCrime);
	gslog_print("  Commerce Wages: %d (%d%%)\n", totalCommerceWages, percentCommerceWages);
	gslog_print("  Commerce Building Upkeep: %d (%d%%)\n", totalCommerceBuildingUpkeep, percentCommerceBuildingUpkeep);
	gslog_print("  Commerce Science: %d (%d%%):\n", totalCommerceScience, percentCommerceScience);
	gslog_print("  Commerce Savings %%: %d\n", percentCommerceSavings);
	gslog_print("  Net Trade: %d\n", totalTrade);

	gslog_print("  Total accumulated science: %d\n", pl->m_science->GetLevel());

	sint32 riot, content, happy;
	sint32 totalCities = g_player[player]->CountCityHappiness(riot, content, happy);
	gslog_print("  Total cities: %d\n", totalCities);
	gslog_print("    Rioting: %d\n", riot);
	gslog_print("    Content: %d\n", content);
	gslog_print("    Happy: %d\n", happy);

	sint32 pop = 0;
	sint32 partialPop = 0;
	sint32 i;
	for(i = 0; i < g_player[player]->m_all_cities->Num(); i++) {
		pop += g_player[player]->m_all_cities->Access(i).PopCount();
		partialPop += g_player[player]->m_all_cities->Access(i).CD()->GetPartialPopulation();
	}

	sint32 totalPartialPop = (pop * k_PEOPLE_PER_POPULATION) + partialPop;
	gslog_print("  Total population: %d/%d, +%d\n", pop, totalPartialPop, totalPartialPop - s_populationHack[player]);
	s_populationHack[player] = totalPartialPop;

	sint32 totalUnits = g_player[player]->m_all_units->Num();
	sint32 totalMilUnits = 0;
	sint32 totalOffense = 0;

	for(i = 0; i < totalUnits; i++) {
		const UnitRecord *rec = g_player[player]->m_all_units->Access(i).GetDBRec();
		if(rec->GetAttack() > 0.001) {
			totalMilUnits++;
			totalOffense += (sint32)rec->GetAttack();
		}
	}
	gslog_print("  Total Units: %d\n", totalUnits);
	gslog_print("  Total Military Units: %d\n", totalMilUnits);
	gslog_print("  Total Attack Strength: %d\n", totalOffense);

	double s;
	g_player[player]->m_tax_rate->GetScienceTaxRate(s);
	gslog_print("  Settings:\n");
	gslog_print("     Science Tax: %d\n", AsPercentage(s));
	gslog_print("              PW: %d\n", sint32(g_player[player]->m_materialsTax * 100));
	gslog_print("         Workday: %d\n", g_player[player]->m_global_happiness->GetUnitlessWorkday());
	gslog_print("           Wages: %d\n", g_player[player]->m_global_happiness->GetUnitlessWages());
	gslog_print("         Rations: %d\n", g_player[player]->m_global_happiness->GetUnitlessRations());

	gslog_print("  Current research: %s\n", g_theAdvanceDB->Get(g_player[player]->m_advances->GetResearching())->GetNameText());

#endif
}
示例#16
0
sint32 TradeManager::CompareSummaryItems(ctp2_ListItem *item1, ctp2_ListItem *item2, sint32 column)
{
	TradeRoute route1 = TradeRoute(uint32(item1->GetUserData()));
	TradeRoute route2 = TradeRoute(uint32(item2->GetUserData()));

	Assert(route1.IsValid());
	Assert(route2.IsValid());	
	if(!route1.IsValid() || !route2.IsValid()) {
		return 0;
	}

	ROUTE_TYPE rtype1, rtype2;
	sint32 resource1, resource2;

	route1.GetSourceResource(rtype1, resource1);
	route2.GetSourceResource(rtype2, resource2);

	switch(column) {
		case k_CITY_COL_SUM_INDEX:
			Assert(route1.GetSource().IsValid());
			Assert(route2.GetSource().IsValid());
			if(route1.GetSource().IsValid() && route2.GetSource().IsValid()) {
				return stricmp(route1.GetSource().GetName(), route2.GetSource().GetName());
			}
			return 0;
		case k_PIRACY_COL_SUM_INDEX:
		{
			sint32 pl1 = -1;
			sint32 pl2 = -1;
			if(route1->IsBeingPirated()) {
				pl1 = route1->GetPiratingArmy().GetOwner();
			}

			if(route2->IsBeingPirated()) {
				pl2 = route2->GetPiratingArmy().GetOwner();
			}

			return pl1 - pl2;
		}

		case k_GOOD_COL_SUM_INDEX:
		case k_GOODICON_COL_SUM_INDEX:
		{
			const MBCHAR *str1 = rtype1 == ROUTE_TYPE_RESOURCE ? g_theResourceDB->Get(resource1)->GetNameText() : 
				g_theStringDB->GetNameStr("ROUTE_TYPE_FOOD");
			const MBCHAR *str2 = rtype2 == ROUTE_TYPE_RESOURCE ? g_theResourceDB->Get(resource2)->GetNameText() : 
				g_theStringDB->GetNameStr("ROUTE_TYPE_FOOD");
			return stricmp(str1, str2);
		}
		case k_TOCITY_COL_SUM_INDEX:
			Assert(route1.GetDestination().IsValid());
			Assert(route2.GetDestination().IsValid());
			if(route1.GetDestination().IsValid() && route2.GetDestination().IsValid()) {
				return stricmp(route1.GetDestination().GetName(), route2.GetDestination().GetName());
			}
			return 0;
		case k_PRICE_COL_SUM_INDEX:
			return route1->GetValue() - route2->GetValue();
		case k_CARAVANS_COL_SUM_INDEX:
			return sint32(route1.GetCost() - route2.GetCost());
		case k_NATION_COL_SUM_INDEX:
			Assert(route1.GetDestination().IsValid());
			Assert(route2.GetDestination().IsValid());
			if(route1.GetDestination().IsValid() && route2.GetDestination().IsValid()) {
				if(route1.GetDestination().GetOwner() == route2.GetDestination().GetOwner()) {
					return stricmp(route1.GetDestination().GetName(), route2.GetDestination().GetName());
				} else {
					return route1.GetDestination().GetOwner() - route2.GetDestination().GetOwner();
				}
			}
			return 0;
		default:
			Assert(FALSE);
			return 0;
	}
}