void HitTimingGraph::Draw(Window& _win)
{
	// Make sure there is something to draw
	if (bins.size() == 0) return;

	// get highest bin for normalization
	int max = 1;
	for (int i = 0; i < bins.size(); i++)
		if (bins[i] > max)
			max = bins[i];
	
	int seperation = 2;
	double xScale = ((double)width/(double)bins.size()) - ((double)seperation/(double)bins.size());
	double yScale = (double)height / (double)max;
	
	_win.driver->draw2DLine(vector2di(absXpos, absYpos), vector2di(absXpos + xScale*bins.size(), absYpos), SColor(255, 255, 255, 255));

	SColor color;
	core::stringw text;
	for (int i = 0; i < bins.size(); i++)
	{
		text = textBins[i];
		color = colorTable.getColor(i);

		_win.driver->draw2DRectangle(color, rect<s32>(absXpos + xScale*i, absYpos - yScale*bins[i], absXpos + xScale*(i + 1) - seperation, absYpos));
		_win.font->draw(text, core::rect<s32>(absXpos + xScale*i, absYpos, 100, 10), video::SColor(255, 255, 255, 255));
		_win.font->draw(core::stringw(bins[i]), core::rect<s32>(absXpos + xScale*i, absYpos - yScale*bins[i] - 10, 100, 10), video::SColor(255, 255, 255, 255));
	}
}
Esempio n. 2
0
void NBEditor::load()
{
	IGUIStaticText* sidebar = state->menu->sidebar;
	IGUIEnvironment* guienv = state->device->getGUIEnvironment();

	if (sidebar) {
		sidebar->setText(L"Node Box Tool");
		IGUIStaticText* t = guienv->addStaticText(L"No node selected",
				rect<s32>(20, 30, 140, 100),
				false, true, sidebar, ENB_GUI_MAIN_MSG);
		
		IGUIListBox* lb = guienv->addListBox(rect<s32>(20, 30, 230, 128),
				sidebar, ENB_GUI_MAIN_LISTBOX, true);

		if (lb) {
			lb->setVisible(false);
			IGUIButton* b1 = guienv->addButton(rect<s32>(0, 100, 50, 125),
					lb, GUI_PROJ_NEW_BOX, L"+", L"Add a node box");
			IGUIButton* b2 = guienv->addButton(rect<s32>(60, 100, 110,125),
					lb, GUI_PROJ_DELETE_BOX, L"-", L"Delete node box");
			b1->setNotClipped(true);
			b2->setNotClipped(true);
		}

		// Create nodebox properties
		t = guienv->addStaticText(L"Properties",
				rect<s32>(0, 170, 120, 190),
				false, true, sidebar, ENB_GUI_PROP);
		t->setVisible(false);

		// Add name properties box
		guienv->addStaticText(L"Name:", rect<s32>(10, 30, 50, 50), false,
				true, t)->setNotClipped(true);
		guienv->addEditBox(L"", rect<s32>(60, 30, 210, 50), true,
				t, ENB_GUI_PROP_NAME)->setNotClipped(true);

		// Add positioning
		addXYZ(t, guienv, vector2di(10, 60),  ENB_GUI_PROP_X1);
		addXYZ(t, guienv, vector2di(10, 160), ENB_GUI_PROP_X2); // 60

		// Add buttons
		guienv->addButton(rect<s32>(30, 250, 100, 280), t, ENB_GUI_PROP_UPDATE,
				L"Update", L"")->setNotClipped(true);
		guienv->addButton(rect<s32>(110, 250, 180, 280), t, ENB_GUI_PROP_REVERT,
				L"Revert", L"")->setNotClipped(true);
	}
	load_ui();
}
	void irrgamePlayerStub::run(irrgameApp* application)
	{
		//TODO: run app in other thread

		//start events handler
		UserEventsHandler->startEventProcess();

		io::IReadFile* file =
				io::SharedFileSystem::getInstance().createReadFile(
						"/Users/gregorytkach/workspace/irrgame_sdk/src/vendors/libpng/pngtest.png");

		video::IImage* img = video::IImage::createImage(file);

		video::ITexture* t =
				new video::COpenGLTexture(img,
						"/Users/gregorytkach/workspace/irrgame_sdk/src/vendors/libpng/pngbar.png",
						0, VideoDriver);

		while (runInternal())
		{
			utils::ITimer::tick();

			events::SharedEventScheduler::getInstance().proceedNextRealTimeEvent();

			VideoDriver->beginScene();

			VideoDriver->draw2DImage(t, vector2di(50, 50),
					recti(50, 50, 150, 150));
//scenemanager->drawAll();

			VideoDriver->endScene();
		}

		//stop events handler
		UserEventsHandler->stopEventProcess();
	}
Esempio n. 4
0
void addXYZ(IGUIElement* parent,IGUIEnvironment* guienv, vector2di pos,int startIndex){
	addBox(parent,guienv,vector2di(pos.X,pos.Y),startIndex,L"X");   // 0,0
	addBox(parent,guienv,vector2di(pos.X,pos.Y+30),startIndex+1,L"Y");   // 80, 0
	addBox(parent,guienv,vector2di(pos.X,pos.Y+60),startIndex+2,L"Z");  // 160, 0
}
Esempio n. 5
0
// ----------------------------------------------------------------------------
void Terrain::draw(const TerrainMod& tm)
{

    vector3df p1 = tm.ray.start - getPosition();
    vector3df p2 = tm.ray.end   - getPosition();

    vector3df v = (p2 - p1).normalize();
    float     t = -p1.Y / v.Y;
    vector3df p = vector3df(p1.X + v.X * t, 0, p1.Z + v.Z * t);

    u32 ix = (int)(p.X / (m_x / m_nx) + 0.5);
    u32 iz = (int)(p.Z / (m_z / m_nz) + 0.5);

    if (ix < 0 || iz < 0 || ix >= m_nx || iz >= m_nz) return;

    u8* img;
    img = (u8*) m_material.getTexture(1)->lock(ETLM_READ_WRITE);

    vector2df tex = m_mesh.vertices[iz * m_nx + ix].TCoords2;

    vector2di tc = vector2di((int)(tex.X * SPIMG_X), (int)(tex.Y * SPIMG_X));

    int r = (int)(tm.radius / m_x * SPIMG_X);

    double e;

    for (int i = tc.X - r; i < tc.X + r; i++)
        for (int j = tc.Y - r; j < tc.Y + r; j++)
        {
        if ((i - tc.X)*(i - tc.X) + (j - tc.Y)*(j - tc.Y) < r*r)
            if ((i > 0 && i < (s32)SPIMG_X && j > 0 && j < (s32)SPIMG_Y))
            {
            TerrainChange terr_ch;
            terr_ch.x = i;
            terr_ch.z = j;
            
            e = tm.dh / 5.0f;
            if (!tm.left_click) e *= -1;

            if (tm.edge_type > 1)
            {
                e *= (1 - ((i - tc.X)*(i - tc.X) + (j - tc.Y)*(j - tc.Y)) / (f32)(r*r));
                if (tm.edge_type == 3) e = sqrt(fabs(e)) * e / fabs(e);
            }
            
            for (int k = 0; k < 4; k++)
                terr_ch.old_v[k] = img[j * SPIMG_X * 4 + i * 4 + k];

            switch (tm.type)
                {
                case HARD_BRUSH:
                    pixelHardBrush(img, j * SPIMG_X * 4 + i * 4, tm.col_mask, !tm.left_click);
                    break;
                case SOFT_BRUSH:
                    pixelSoftBrush(img, j * SPIMG_X * 4 + i * 4, tm.col_mask, e);
                    break;
                case BRIGHTNESS_MOD:
                    pixelBrigBrush(img, j * SPIMG_X * 4 + i * 4, e * 255);
                    break;
                }

            for (int k = 0; k < 4; k++)
                terr_ch.vchanged[k] = (terr_ch.old_v[k] != img[j * SPIMG_X * 4 + i * 4 + k]);

            terr_ch.img = img;
            tm.cmd->addVertex(&terr_ch);
            }

        }
    m_material.getTexture(1)->unlock();
    m_material.getTexture(1)->regenerateMipMapLevels();
} // draw
Esempio n. 6
0
bool ClientEventReceiver::OnEvent(const SEvent& event)
{
	if (event.EventType == irr::EET_KEY_INPUT_EVENT)
	{
		KeyIsDown[event.KeyInput.Key] = event.KeyInput.PressedDown;
		if (event.KeyInput.Key >= KEY_KEY_1 && event.KeyInput.Key <= KEY_KEY_9)
		{
			if (Universe::instance->guienv->getFocus() != Universe::instance->guienv->getRootGUIElement()->getElementFromId(ChatBox)->getElementFromId(ChatInputEditBox))
			{
				IGUIElement* hkb = Universe::instance->guienv->getRootGUIElement()->getElementFromId(HotkeyBar);
				CGUIButton* btn = ((IGUIIconTable*)hkb)->getButtonAt(event.KeyInput.Key - KEY_KEY_1);
				if (btn)
				{
					SEvent clickEvent;
					clickEvent.EventType = EET_GUI_EVENT;
					clickEvent.GUIEvent.EventType = EGET_BUTTON_CLICKED;
					clickEvent.GUIEvent.Caller = btn;
					Universe::instance->render->device->postEventFromUser(clickEvent);
				}
			}
		}
		else if (KeyIsDown[KEY_ESCAPE])
		{ //Return to the main menu
			delete Universe::instance->login;
			delete Universe::instance->password;
			Universe::instance->login = NULL;
			Universe::instance->password = NULL;
			Universe::instance->state = NextLevel;
		}
		else if (KeyIsDown[KEY_RETURN])
		{
			Universe::instance->guienv->setFocus(Universe::instance->guienv->getRootGUIElement()->getElementFromId(ChatBox)->getElementFromId(ChatInputEditBox));
		}
	}
	else if(event.EventType == irr::EET_MOUSE_INPUT_EVENT)
	{
		for (s32 i = 0; i < EMIE_COUNT; ++i)
            Mouse[i] = i == event.MouseInput.Event;
		IGUIElement* guiElement = Universe::instance->guienv->getRootGUIElement()->getElementFromPoint(vector2di(event.MouseInput.X, event.MouseInput.Y));
		if (guiElement != NULL)
		{ //Mouse is in a window area
			if (guiElement->getID() != 0) //Mouse is on GUI element
				return false;
		}
		else //Mouse is not in a window area
			return false;
		if (Mouse[EMIE_LMOUSE_PRESSED_DOWN])
		{
			CurrentMapObject<MapObject>* targetCurrentMapObject;

			CGUIButton* leftMouseBind = ((IGUIIconTable*)Universe::instance->guienv->getRootGUIElement()->getElementFromId(HotkeyBar))->selectedButton;
			if (leftMouseBind)
			{
				int targetType;
				char outPacket[256];
				
				if (targetCurrentMapObject = (CurrentMapObject<MapObject>*)Universe::instance->render->GetCurrentMapObjectUnderCursor<CurrentNPC>(Universe::instance->currentLocation->currentNPCs, Universe::instance->currentLocation->currentNPCsCount))
				{
					targetType = 0;
				}
				else if (targetCurrentMapObject = (CurrentMapObject<MapObject>*)Universe::instance->render->GetCurrentMapObjectUnderCursor<CurrentCharacter>(Universe::instance->currentLocation->currentCharacters, Universe::instance->currentLocation->currentCharactersCount))
				{
					targetType = 3;
				}
				else
					targetType = -1;

				CreatePacket(outPacket, SkillUse, "%i%b%i", leftMouseBind->currentGameObject->id, targetType, targetCurrentMapObject ? targetCurrentMapObject->id : 0);
				Universe::instance->connectSocket->Send(outPacket);
			}
		}
		else if (Mouse[EMIE_RMOUSE_PRESSED_DOWN])
		{
			CurrentMapObject<MapObject>* targetCurrentMapObject;
			if (targetCurrentMapObject = (CurrentMapObject<MapObject>*)Universe::instance->render->GetCurrentMapObjectUnderCursor<CurrentNPC>(Universe::instance->currentLocation->currentNPCs, Universe::instance->currentLocation->currentNPCsCount))
			{
				char outPacket[256];

				CreatePacket(outPacket, DialogOpen, "%i%i", targetCurrentMapObject->id, 0);
				Universe::instance->connectSocket->Send(outPacket);
			}
			else if (targetCurrentMapObject = (CurrentMapObject<MapObject>*)Universe::instance->render->GetCurrentMapObjectUnderCursor<CurrentItem>(Universe::instance->currentLocation->currentItems, Universe::instance->currentLocation->currentItemsCount))
			{
				char outPacket[256];

				f32 distance = vector2d<f32>(targetCurrentMapObject->x, targetCurrentMapObject->y).getDistanceFrom(vector2d<f32>(Universe::instance->currentCharacter->x, Universe::instance->currentCharacter->y));
				if (distance < 3.0f)
				{
					CreatePacket(outPacket, ItemPickUp, "%i", targetCurrentMapObject->id);
				}
				else
				{ //Emulate character's move request to this item
					double targetX, targetY;
					//TODO: other angles
					targetX = targetCurrentMapObject->x + (targetCurrentMapObject->x < Universe::instance->currentCharacter->x ? 1.0f : -1.0f);
					targetY = targetCurrentMapObject->y + (targetCurrentMapObject->y < Universe::instance->currentCharacter->y ? 1.0f : -1.0f);
					CreatePacket(outPacket, Move, "%f%f", targetX, targetY);
				}

				Universe::instance->connectSocket->Send(outPacket);
			}
			else
			{ //Move
				char outPacket[256];
				vector2d<f32> clickPos = Universe::instance->render->MouseCoordToWorldCoord();
				if (clickPos.X > 0 && clickPos.X < Universe::instance->currentLocation->width && clickPos.Y > 0 && clickPos.Y < Universe::instance->currentLocation->height)
					if (Universe::instance->currentLocation->mask[(int)clickPos.Y][(int)clickPos.X] == Free) //TODO: see 'void Location::SpawnStatic(CurrentStatic* currentStatic)'
					{
						CreatePacket(outPacket, Move, "%f%f", clickPos.X, clickPos.Y);
						Universe::instance->connectSocket->Send(outPacket);
					}
			}
		}
		else if (Mouse[EMIE_MOUSE_WHEEL])
		{
			f32 cameraNextY = Universe::instance->cameraY + event.MouseInput.Wheel * 5.0f;
			if (cameraNextY > 5.0f && cameraNextY < 200.0f)
				Universe::instance->cameraY = cameraNextY;
		}
	}
	else if (event.EventType == EET_GUI_EVENT)
	{
		s32 eventCallerId = event.GUIEvent.Caller->getID();
		IGUIElement* eventCaller = event.GUIEvent.Caller;

		switch(event.GUIEvent.EventType)
		{
			case RPGATOR_EET_ELEMENT_DRAGGED:
				if (event.GUIEvent.Element)
				{ //Element dragged to an GUI element
					if (event.GUIEvent.Element->getParent())
					{ //Element dragged to an GUI element that has parent (IGUIIconTableContainer)
						if (event.GUIEvent.Element->getParent()->getID() == HotkeyBar)
						{ //Empty cell
							CGUIButton* hotkeyButton = new CGUIButton(*((CGUIButton*)event.GUIEvent.Caller));
							((IGUIIconTable::IGUIIconTableContainer*)event.GUIEvent.Element)->setButton(hotkeyButton);
						}
						else if (event.GUIEvent.Element->getParent()->getParent())
						{ //Element dragged to an GUI element that has parent (IGUIIconTable)
							if (event.GUIEvent.Element->getParent()->getParent()->getID() == HotkeyBar)
							{ //Existing cell
								CGUIButton* hotkeyButton = new CGUIButton(*((CGUIButton*)event.GUIEvent.Caller));
								((IGUIIconTable::IGUIIconTableContainer*)event.GUIEvent.Element->getParent())->setButton(hotkeyButton);
							}
						}
					}
				}
				break;
			case EGET_EDITBOX_ENTER:
				switch (eventCallerId)
				{
					case ChatInputEditBox:
						IGUIElement* eb = Universe::instance->guienv->getRootGUIElement()->getElementFromId(ChatBox)->getElementFromId(ChatInputEditBox);
						if (wcslen(eb->getText()) > 0)
						{
							char outPacket[256];
							CreatePacket(outPacket, Say, "%b%ws", Public, eb->getText());
							Universe::instance->connectSocket->Send(outPacket);
							eb->setText(NULL);
						}
						break;
				}
				break;
			case EGDT_WINDOW_CLOSE:
				switch (eventCallerId)
				{
					case InventoryWindow:
						((IGUIButton*)Universe::instance->guienv->getRootGUIElement()->getElementFromId(InventoryToggleButton))->setPressed(false);
						break;
					case SkillsWindow:
						((IGUIButton*)Universe::instance->guienv->getRootGUIElement()->getElementFromId(SkillsToggleButton))->setPressed(false);
						break;
				}
				break;
			case EGET_BUTTON_CLICKED:
				switch (eventCallerId)
				{
					case IconTableItemButton:
					{
						char outPacket[256];
						CreatePacket(outPacket, ItemUse, "%i", ((CGUIButton*)eventCaller)->currentGameObject->id);
						Universe::instance->connectSocket->Send(outPacket);
						break;
					}
					case IconTableSkillButton:
					{
						((IGUIIconTable*)eventCaller->getParent()->getParent())->selectedButton = (CGUIButton*)eventCaller;
						
						//rightMouseBind = eventCaller;
						/*
						char outPacket[256];
						CurrentMapObject<MapObject>* targetCurrentMapObject;
						int currentMapObjectId;
						int targetType;

						if (targetCurrentMapObject = (CurrentMapObject<MapObject>*)Universe::instance->render->GetCurrentMapObjectUnderCursor<CurrentNPC>(Universe::instance->currentLocation->currentNPCs, Universe::instance->currentLocation->currentNPCsCount))
						{
							currentMapObjectId = targetCurrentMapObject->id;
							targetType = 0;
						}
						else if (targetCurrentMapObject = (CurrentMapObject<MapObject>*)Universe::instance->render->GetCurrentMapObjectUnderCursor<CurrentCharacter>(Universe::instance->currentLocation->currentCharacters, Universe::instance->currentLocation->currentCharactersCount))
						{
							currentMapObjectId = targetCurrentMapObject->id;
							targetType = 3;
						}
						else
						{
							currentMapObjectId = 0;
							targetType = -1;
						}

						CreatePacket(outPacket, SkillUse, "%i%b%i", ((CGUIButton*)eventCaller)->currentGameObject->id, targetType, currentMapObjectId);
						Universe::instance->connectSocket->Send(outPacket);
						*/
						break;
					}
					case InventoryToggleButton:
					{
						IGUIWindow* wnd = (IGUIWindow*)Universe::instance->guienv->getRootGUIElement()->getElementFromId(InventoryWindow);
						if (wnd)
							wnd->remove();
						else
						{
							int btnsSize = 48;

							wnd = Universe::instance->guienv->addWindow(rect< s32 >(Universe::instance->render->screenWidth - btnsSize * 6 - (6 - 1) * 2 - 20, 150, Universe::instance->render->screenWidth, 150 + 100 + btnsSize * 6 + (6 - 1) * 2 + 10), false, L"Inventory", NULL, InventoryWindow);

							IGUIIconTable* tbl = new IGUIIconTable(Universe::instance->guienv, wnd, InventoryItemsIconTable, rect< s32 >(10, 100, 10 + btnsSize * 6 + (6 - 1) * 2, 100 + btnsSize * 6 + (6 - 1) * 2), 6, 6);
							tbl->buttonSize = btnsSize;
							wnd->addChild(tbl);
							for (int i = 0; i < Universe::instance->currentCharacter->currentItemsCount; i++)
							{
								tbl->addButton((CurrentGameObject<GameObject>*)Universe::instance->currentCharacter->currentItems[i], IconTableItemButton);
							}
						}
						break;
					}
					case SkillsToggleButton:
					{
						IGUIWindow* wnd = (IGUIWindow*)Universe::instance->guienv->getRootGUIElement()->getElementFromId(SkillsWindow);
						if (wnd)
							wnd->remove();
						else
						{
							int btnsSize = 48;

							wnd = Universe::instance->guienv->addWindow(rect< s32 >(Universe::instance->render->screenWidth - btnsSize * 6 - (6 - 1) * 2 - 20 - 400, 150, Universe::instance->render->screenWidth - 400, 150 + 100 + btnsSize * 6 + (6 - 1) * 2 + 10), false, L"Skills", NULL, SkillsWindow);

							IGUIIconTable* tbl = new IGUIIconTable(Universe::instance->guienv, wnd, SkillsIconTable, rect< s32 >(10, 100, 10 + btnsSize * 6 + (6 - 1) * 2, 100 + btnsSize * 6 + (6 - 1) * 2), 6, 6);
							tbl->buttonSize = btnsSize;
							wnd->addChild(tbl);
							for (int i = 0; i < Universe::instance->currentCharacter->currentSkillsCount; i++)
							{
								tbl->addButton((CurrentGameObject<GameObject>*)Universe::instance->currentCharacter->currentSkills[i], IconTableSkillButton);
							}
						}
						break;
					}
					case ChatInputEditBox:
						Universe::instance->guienv->getRootGUIElement()->getElementFromId(ChatInputEditBox)->setText(L"");
						break;
					default:
						if (eventCallerId > DialogElement) //Dialog button
						{
							char outPacket[256];
							int currentNPCId;

							swscanf(eventCaller->getParent()->getText(), L"[%d]", &currentNPCId);
							eventCaller->getParent()->remove();
							CreatePacket(outPacket, DialogOpen, "%i%i", currentNPCId, eventCallerId - DialogElement);
							Universe::instance->connectSocket->Send(outPacket);
						}
						break;
				}
				break;
			case EGET_COMBO_BOX_CHANGED:
				break;
			case EGET_TAB_CHANGED:
				break;
			case EGET_CHECKBOX_CHANGED:
				break;
		}
	}

	return false;
}
Esempio n. 7
0
bool Player::ProcessEvent(const SGUIEvent* e)
{
	SWRayObjIntersect isc; //screen ray intersection
	bool rc = false; //rotation change flag
	mmask_t modb = BUTTON_CTRL | BUTTON_SHIFT | BUTTON_ALT;

	switch (e->t) {
	case GUIEV_MOUSE:

		if (e->m.bstate & (GUISCRL_UP | GUISCRL_DW)) {
			//Wheel (camera rotation)
			if ((e->m.bstate & modb) == rot_ver)
				rot.X += (e->m.bstate & GUISCRL_UP)? rspd:-rspd;

			else if ((e->m.bstate & modb) == rot_hor)
				rot.Z -= (e->m.bstate & GUISCRL_UP)? rspd:-rspd;

			else return false;

			rc = true;

		} else if (e->m.bstate == BUTTON1_PRESSED) {
			//Action button
			isc = *(world->ScreenRay(vector2di(e->m.x,e->m.y)));
			switch (state) {
			case PCS_EXPLORING:
				if (!isc.model) return true;
				if (isc.model == model) {
					world->LogMsg("SELFPOINT_LOG");
				} else if (isc.actor) {
					world->GetMsgSys()->SetActorName(isc.actor->GetAttributes().name);
					if (isc.actor->GetAttributes().female)
						world->LogMsg("ACTRESS_LOG");
					else
						world->LogMsg("ACTOR_LOG");
				}
				break;

			case PCS_INTERACTING:
				//TODO
				break;

			case PCS_COMBAT:
				if (isc.pnt != vector3di(-1))
					world->FireTo(isc.pnt,&isc);
				break;

			default: break;
			}
		} else
			return false;
		break;

	case GUIEV_KEYPRESS:

		switch (binder->DecodeKey(e->k)) {
		default: return false;

		case PAKEY_WALK_FORW: Move(LMOVE_FORW,1.2f); break; //FIXME: use speed value
		case PAKEY_WALK_BACK: Move(LMOVE_BACK,1.2f); break;
		case PAKEY_WALK_LEFT: Move(LMOVE_LEFT,1.2f); break;
		case PAKEY_WALK_RGHT: Move(LMOVE_RGHT,1.2f); break;

		case PAKEY_RUN_FORW: Move(LMOVE_FORW,2.2f); break; //FIXME: use speed value
		case PAKEY_RUN_BACK: Move(LMOVE_BACK,2.2f); break;
		case PAKEY_RUN_LEFT: Move(LMOVE_LEFT,2.2f); break;
		case PAKEY_RUN_RGHT: Move(LMOVE_RGHT,2.2f); break;

		case PAKEY_TURN_LEFT: rot.Z += rspd; rc = true; break;
		case PAKEY_TURN_RGHT: rot.Z -= rspd; rc = true; break;
		case PAKEY_TURN_UP: rot.X += rspd; rc = true; break;
		case PAKEY_TURN_DW: rot.X -= rspd; rc = true; break;

		case PAKEY_TOG_STATE:
			//TODO: check conditions, apply some changes etc
			switch (state) {
			case PCS_EXPLORING:
				state = PCS_INTERACTING;
				break;
			case PCS_INTERACTING:
				state = PCS_COMBAT;
				break;
			case PCS_COMBAT:
				state = PCS_EXPLORING;
				break;
			case PCS_VEHICLE: break;
			}

		}
		break;

	default:
		return false;
	}

	if (rc) SetRot(rot); //Update rotation

	return true;
}