void Menu::initButtonMain() { if ((play = env->addButton(irr::core::rect<irr::s32>(130, 185, 630, 260), 0, GUI_ID_PLAY, L"", L"start new Game")) == NULL) throw Excep("Impossible de cree le boutton"); if ((load = env->addButton(irr::core::rect<irr::s32>(130, 320, 630, 395), 0, GUI_ID_LOAD, L"", L"Load a game")) == NULL) throw Excep("Impossible de cree le boutton"); if ((option = env->addButton(irr::core::rect<irr::s32>(130, 455, 630, 530), 0, GUI_ID_OPTION, L"", L"Game options")) == NULL) throw Excep("Impossible de cree le boutton"); if ((quit = env->addButton(irr::core::rect<irr::s32>(130, 590, 630, 665), 0, GUI_ID_QUIT, L"", L"Exits program")) == NULL) throw Excep("Impossible de cree le boutton"); }
void Menu::initNameMenu() { if ((playN = env->addButton(rect(100, 550, 600, 625), 0, GUI_ID_PLAY_N, L"", L"start new Game")) == NULL) throw Excep("Impossible de charger la texture"); if ((cancelN = env->addButton(rect(100, 661, 600, 736), 0, GUI_ID_CANCEL_N, L"", L"Return to main menu")) == NULL) throw Excep("Impossible de charger la texture"); textureButton(playN, PLAY_BUTTON); textureButton(cancelN, CANCEL_BUTTON); if ((nameP1 = env->addEditBox(L"Player1", rect(420,200,870,265), true, 0, GUI_ID_SET_NAME_ONE)) == NULL) throw Excep("Impossible de charger la texture"); if ((nameP2 = env->addEditBox(L"Player2", rect(420,307,870,372), true, 0, GUI_ID_SET_NAME_TWO)) == NULL) throw Excep("Impossible de charger la texture"); if ((nameP3 = env->addEditBox(L"Player3", rect(420,414,870,479), true, 0, GUI_ID_SET_NAME_THREE)) == NULL) throw Excep("Impossible de charger la texture"); }
Menu::Menu(Event *event, irr::video::IVideoDriver *dr, irrSmgr *s, irr::gui::IGUIEnvironment *e) : event(event), driver(dr), smgr(s), env(e), play(NULL), playN(NULL), quit(NULL), option(NULL), load(NULL), cancelN(NULL), cancelP(NULL), one(NULL), two(NULL), three(NULL), ia(NULL) { if ((imgMenu = driver->getTexture(BACKGROUND_MENU)) == NULL) throw Excep("Impossible de charger une texture"); b = true; p = true; d = true; }
void Menu::initPlayMenu() { if ((one = env->addButton(rect(130, 185, 630, 260), 0, GUI_ID_ONE_PLAYER, L"", L"Play solo")) == NULL) throw Excep("Impossible de charger la texture"); if ((two = env->addButton(rect(130, 320, 630, 395), 0, GUI_ID_TWO_PLAYERS, L"", L"Play at two")) == NULL) throw Excep("Impossible de charger la texture"); if ((ia = env->addButton(rect(X_IA_BUTTON, Y_IA_BUTTON, X_IA_BUTTON_END, Y_IA_BUTTON_END), 0, GUI_ID_IA_PLAYERS, L"", L"Play IA")) == NULL) throw Excep("Impossible de charger la texture"); if ((three = env->addButton(rect(130, 455, 630, 530), 0, GUI_ID_THREE_PLAYERS, L"", L"Play at three")) == NULL) throw Excep("Impossible de charger la texture"); if ((cancelP = env->addButton(rect(130, 590, 630, 665), 0, GUI_ID_CANCEL_P, L"", L"Return to main menu")) == NULL) throw Excep("Impossible de charger la texture"); textureButton(one, SOLO_BUTTON); textureButton(two, TWO_PLAYERS_BUTTON); textureButton(three, THREE_PLAYERS_BUTTON); textureButton(cancelP,CANCEL_BUTTON); textureButton(ia, IA_BUTTON); }
/*** Execute this node ***/ Outcome Input::execute() { for(int i = 0; i < (int) exprs.size(); i++) { if(exprs.at(i)->getType() != OP_VARIABLE) throw Excep(getLineNumber(), getColumnNumber(), "Expected variable name to input statement!"); // Input text if(getText) { char str[256]; std::cin.getline(str, 256); Assign(static_cast<Variable*>(exprs.at(i))->clone(), new Text(std::string(str))).execute(); continue; } // Input a number or logical std::string text; do { char str[256]; std::cin.getline(str, 256); text = std::string(str); } while(text == "" || (!isInteger(text) && !isReal(text) && text != "yes" && text != "no")); if(isInteger(text)) Assign(static_cast<Variable*>(exprs.at(i))->clone(), new Integer(text)).execute(); else if(isReal(text)) Assign(static_cast<Variable*>(exprs.at(i))->clone(), new Real(text)).execute(); else if(text == "yes") Assign(static_cast<Variable*>(exprs.at(i))->clone(), new Logical(true)).execute(); else Assign(static_cast<Variable*>(exprs.at(i))->clone(), new Logical(false)).execute(); } return Outcome(S_SUCCESS); }
/*** Evaluate this object ***/ Object* SpecialFunction::evaluate() { if(args.size() == 0) throw Excep(getLineNumber(), getColumnNumber(), "Expected argument to special function!"); std::auto_ptr<Object> arg1(args.at(0)->evaluate()); if(id == SPF_INDEX) { if(args.size() != 2) throw Excep(getLineNumber(), getColumnNumber(), "Invalid number of arguments passed to special function!"); std::auto_ptr<Object> arg2(args.at(1)->evaluate()); if(arg2->getType() == OBJ_TEXT) { if(arg1->getType() != OBJ_TEXT) throw InvalidTypeException(getLineNumber(), getColumnNumber(), OBJ_TEXT, arg1->getType(), 1); Text* cast1 = static_cast<Text*>(arg1.get()); Text* cast2 = static_cast<Text*>(arg2.get()); size_t index = cast2->getValue().find(cast1->getValue()); if(index != std::string::npos) return new Integer(index + 1); return new Integer(0); } if(arg2->getType() == OBJ_SEQUENCE) { Sequence* cast = dynamic_cast<Sequence*>(arg2.get()); for(unsigned int i = 0; i < cast->getLength(); i++) { std::auto_ptr<Logical> eqOp(static_cast<Logical*>(Equal(arg1->clone(), cast->getObject(i)->clone()).evaluate())); if(eqOp->getValue() == true) return new Integer(i + 1); } return new Integer(0); } throw InvalidTypeException(getLineNumber(), getColumnNumber(), OBJ_TEXT | OBJ_SEQUENCE, arg2->getType(), 2); } if(args.size() > 1) throw Excep(getLineNumber(), getColumnNumber(), "Invalid number of arguments passed to special function!"); if(id == SPF_ABS) { if(arg1->getType() == OBJ_INTEGER) { Integer* cast = static_cast<Integer*>(arg1.get()); if(cast->getValue() < 0) return new Integer(-cast->getValue()); return new Integer(cast->getValue()); } if(arg1->getType() == OBJ_REAL) { Real* cast = static_cast<Real*>(arg1.get()); if(cast->getValue() < 0) return new Real(-cast->getValue()); return new Real(cast->getValue()); } throw InvalidTypeException(getLineNumber(), getColumnNumber(), OBJ_INTEGER | OBJ_REAL, arg1->getType(), 1); } if(id == SPF_SIGN) { if(arg1->getType() == OBJ_INTEGER) { Integer* cast = static_cast<Integer*>(arg1.get()); if(cast->getValue() < 0) return new Integer(-1); if(cast->getValue() > 0) return new Integer(1); return new Integer(0); } if(arg1->getType() == OBJ_REAL) { Real* cast = static_cast<Real*>(arg1.get()); if(cast->getValue() < 0) return new Integer(-1); if(cast->getValue() > 0) return new Integer(1); return new Integer(0); } throw InvalidTypeException(getLineNumber(), getColumnNumber(), OBJ_INTEGER | OBJ_REAL, arg1->getType(), 1); } if(id == SPF_SQRT) { if(arg1->getType() == OBJ_INTEGER) { Integer* cast = static_cast<Integer*>(arg1.get()); if(cast->getValue() < 0) throw NegativeValueException(getLineNumber(), getColumnNumber(), cast->getValue(), 1); double res = sqrt((double) cast->getValue()); if((long) res == res) return new Integer((long) res); return new Real(res); } if(arg1->getType() == OBJ_REAL) { Real* cast = static_cast<Real*>(arg1.get()); if(cast->getValue() < 0) throw NegativeValueException(getLineNumber(), getColumnNumber(), cast->getValue(), 1); double res = sqrt((double) cast->getValue()); return new Real(res); } throw InvalidTypeException(getLineNumber(), getColumnNumber(), OBJ_INTEGER | OBJ_REAL, arg1->getType(), 1); } if(id == SPF_ENTIER) { if(arg1->getType() == OBJ_INTEGER) { Integer* cast = static_cast<Integer*>(arg1.get()); return new Integer(cast->getValue()); } if(arg1->getType() == OBJ_REAL) { Real* cast = static_cast<Real*>(arg1.get()); return new Integer(floor(cast->getValue())); } throw InvalidTypeException(getLineNumber(), getColumnNumber(), OBJ_INTEGER | OBJ_REAL, arg1->getType(), 1); } if(id == SPF_ROUND) { if(arg1->getType() == OBJ_INTEGER) { Integer* cast = static_cast<Integer*>(arg1.get()); return new Integer(cast->getValue()); } if(arg1->getType() == OBJ_REAL) { Real* cast = static_cast<Real*>(arg1.get()); long rounded = cast->getValue() < 0.0 ? ceil(cast->getValue() - 0.5) : floor(cast->getValue() + 0.5); return new Integer(rounded); } throw InvalidTypeException(getLineNumber(), getColumnNumber(), OBJ_INTEGER | OBJ_REAL, arg1->getType(), 1); } if(id == SPF_RAND) { if(arg1->getType() == OBJ_INTEGER) { Integer* cast = static_cast<Integer*>(arg1.get()); if(cast->getValue() < 0) throw NegativeValueException(getLineNumber(), getColumnNumber(), cast->getValue(), 1); double f = (double) rand() / RAND_MAX; return new Real( f * cast->getValue() ); } if(arg1->getType() == OBJ_REAL) { Real* cast = static_cast<Real*>(arg1.get()); if(cast->getValue() < 0) throw NegativeValueException(getLineNumber(), getColumnNumber(), cast->getValue(), 1); double f = (double) rand() / RAND_MAX; return new Real( f * cast->getValue() ); } throw InvalidTypeException(getLineNumber(), getColumnNumber(), OBJ_INTEGER | OBJ_REAL, arg1->getType(), 1); } if(id == SPF_INTRAND) { if(arg1->getType() == OBJ_INTEGER) { Integer* cast = static_cast<Integer*>(arg1.get()); if(cast->getValue() < 0) throw NegativeValueException(getLineNumber(), getColumnNumber(), cast->getValue(), 1); return new Integer( rand() % cast->getValue() + 1 ); } if(arg1->getType() == OBJ_REAL) { Real* cast = static_cast<Real*>(arg1.get()); if(cast->getValue() < 0) throw NegativeValueException(getLineNumber(), getColumnNumber(), cast->getValue(), 1); return new Integer( rand() % (long) cast->getValue() + 1 ); } throw InvalidTypeException(getLineNumber(), getColumnNumber(), OBJ_INTEGER | OBJ_REAL, arg1->getType(), 1); } if(id == SPF_ISEMPTY) { return new Logical(arg1->getType() == OBJ_EMPTY); } if(id == SPF_ISLOG) { return new Logical(arg1->getType() == OBJ_LOGICAL); } if(id == SPF_ISINT) { return new Logical(arg1->getType() == OBJ_INTEGER); } if(id == SPF_ISREAL) { return new Logical(arg1->getType() == OBJ_REAL); } if(id == SPF_ISTEXT) { return new Logical(arg1->getType() == OBJ_TEXT); } if(id == SPF_ISSEQ) { return new Logical(arg1->getType() == OBJ_SEQUENCE); } if(id == SPF_ISPROC) { return new Logical(arg1->getType() == OBJ_PROCEDURE); } if(id == SPF_ISFUN) { return new Logical(arg1->getType() == OBJ_FUNCTION || arg1->getType() == OBJ_SPFUNCTION); } if(id == SPF_SIN) { if(arg1->getType() == OBJ_INTEGER) { Integer* cast = static_cast<Integer*>(arg1.get()); return new Real(sin((double) cast->getValue())); } if(arg1->getType() == OBJ_REAL) { Real* cast = static_cast<Real*>(arg1.get()); return new Real(sin(cast->getValue())); } throw InvalidTypeException(getLineNumber(), getColumnNumber(), OBJ_INTEGER | OBJ_REAL, arg1->getType(), 1); } if(id == SPF_COS) { if(arg1->getType() == OBJ_INTEGER) { Integer* cast = static_cast<Integer*>(arg1.get()); return new Real(cos((double) cast->getValue())); } if(arg1->getType() == OBJ_REAL) { Real* cast = static_cast<Real*>(arg1.get()); return new Real(cos(cast->getValue())); } throw InvalidTypeException(getLineNumber(), getColumnNumber(), OBJ_INTEGER | OBJ_REAL, arg1->getType(), 1); } if(id == SPF_TG) { if(arg1->getType() == OBJ_INTEGER) { Integer* cast = static_cast<Integer*>(arg1.get()); return new Real(tan((double) cast->getValue())); } if(arg1->getType() == OBJ_REAL) { Real* cast = static_cast<Real*>(arg1.get()); return new Real(tan(cast->getValue())); } throw InvalidTypeException(getLineNumber(), getColumnNumber(), OBJ_INTEGER | OBJ_REAL, arg1->getType(), 1); } if(id == SPF_ARCSIN) { if(arg1->getType() == OBJ_INTEGER) { Integer* cast = static_cast<Integer*>(arg1.get()); if(errno == EDOM) throw new Excep(getLineNumber(), getColumnNumber(), "Invalid value passed to special function!"); return new Real(exp((double) cast->getValue())); } if(arg1->getType() == OBJ_REAL) { Real* cast = static_cast<Real*>(arg1.get()); if(errno == EDOM) throw new Excep(getLineNumber(), getColumnNumber(), "Invalid value passed to special function!"); return new Real(exp(cast->getValue())); } throw InvalidTypeException(getLineNumber(), getColumnNumber(), OBJ_INTEGER | OBJ_REAL, arg1->getType(), 1); } if(id == SPF_ARCTG) { if(arg1->getType() == OBJ_INTEGER) { Integer* cast = static_cast<Integer*>(arg1.get()); if(errno == EDOM) throw new Excep(getLineNumber(), getColumnNumber(), "Invalid value passed to special function!"); return new Real(exp((double) cast->getValue())); } if(arg1->getType() == OBJ_REAL) { Real* cast = static_cast<Real*>(arg1.get()); if(errno == EDOM) throw new Excep(getLineNumber(), getColumnNumber(), "Invalid value passed to special function!"); return new Real(exp(cast->getValue())); } throw InvalidTypeException(getLineNumber(), getColumnNumber(), OBJ_INTEGER | OBJ_REAL, arg1->getType(), 1); } if(id == SPF_EXP) { if(arg1->getType() == OBJ_INTEGER) { Integer* cast = static_cast<Integer*>(arg1.get()); return new Real(exp((double) cast->getValue())); } if(arg1->getType() == OBJ_REAL) { Real* cast = static_cast<Real*>(arg1.get()); return new Real(exp(cast->getValue())); } throw InvalidTypeException(getLineNumber(), getColumnNumber(), OBJ_INTEGER | OBJ_REAL, arg1->getType(), 1); } if(id == SPF_LN) { if(arg1->getType() == OBJ_INTEGER) { Integer* cast = static_cast<Integer*>(arg1.get()); return new Real(log((double) cast->getValue())); } if(arg1->getType() == OBJ_REAL) { Real* cast = static_cast<Real*>(arg1.get()); return new Real(log(cast->getValue())); } throw InvalidTypeException(getLineNumber(), getColumnNumber(), OBJ_INTEGER | OBJ_REAL, arg1->getType(), 1); } if(id == SPF_LG) { if(arg1->getType() == OBJ_INTEGER) { Integer* cast = static_cast<Integer*>(arg1.get()); return new Real(log10((double) cast->getValue())); } if(arg1->getType() == OBJ_REAL) { Real* cast = static_cast<Real*>(arg1.get()); return new Real(log10(cast->getValue())); } throw InvalidTypeException(getLineNumber(), getColumnNumber(), OBJ_INTEGER | OBJ_REAL, arg1->getType(), 1); } throw Excep(getLineNumber(), getColumnNumber(), "Invalid special function!"); }
Click Menu::mainMenu() { if ((imgMenu = driver->getTexture(BACKGROUND_MENU)) == NULL) throw Excep("Impossible de charger la texture"); return Click::NOP; }
/*** Execute this node ***/ Outcome For::execute() { // Check for the for value if(forValue == 0) throw Excep(getLineNumber(), getColumnNumber(), "No variable specified in for loop."); if(forValue->getType() != OP_VARIABLE) throw Excep(getLineNumber(), getColumnNumber(), "For loop must be given a valid variable."); // Store the for value variable Variable* forVar = static_cast<Variable*>(forValue); // If a from value was given, set the counter to this initial value if(from != 0) { // Evaluate the std::auto_ptr<Object> fromEval(from->evaluate()); if(fromEval->getType() != OBJ_INTEGER && fromEval->getType() != OBJ_REAL) throw InvalidTypeException(getLineNumber(), getColumnNumber(), OBJ_INTEGER | OBJ_REAL, fromEval->getType()); Assign(forVar->clone(), fromEval.release()).execute(); } else Assign(forVar->clone(), new Integer(1)).execute(); // Create an Outcome object to store the result Outcome result(S_SUCCESS); do { // Check the while condition, if present if(whileCond != 0) { std::auto_ptr<Object> whileCondEval(whileCond->evaluate()); if(whileCondEval->getType() != OBJ_LOGICAL) throw InvalidTypeException(getLineNumber(), getColumnNumber(), OBJ_LOGICAL, whileCondEval->getType()); bool whileCondResult = static_cast<Logical*>(whileCondEval.get())->getValue(); if(!whileCondResult) break; } // Check the to value if(to != 0) { std::auto_ptr<Object> toEval(to->evaluate()); // Store the step value evaluated std::auto_ptr<Object> stepEval; if(step == 0) stepEval.reset(new Integer(1)); else stepEval.reset(step->evaluate()); // Confirm that the step is an integer if(stepEval->getType() != OBJ_INTEGER && stepEval->getType() != OBJ_REAL) throw InvalidTypeException(getLineNumber(), getColumnNumber(), OBJ_INTEGER | OBJ_REAL, stepEval->getType()); std::auto_ptr<Real> castStep; // Cast the step value to a real if(stepEval->getType() == OBJ_INTEGER) castStep.reset(new Real(static_cast<Integer*>(stepEval.get())->getValue())); else castStep.reset(static_cast<Real*>(stepEval.release())); bool toCondition = false; if(castStep->getValue() > 0) { std::auto_ptr<Object> operation(Greater(forVar->clone(), toEval.release()).evaluate()); toCondition = static_cast<Logical*>(operation.get())->getValue(); } if(castStep->getValue() < 0) { std::auto_ptr<Object> operation(Less(forVar->clone(), toEval.release()).evaluate()); toCondition = static_cast<Logical*>(operation.get())->getValue(); } if(toCondition) break; } // Execute the NodeList of statements result = list->execute(); // Modify forVar based on step if(step == 0) { std::auto_ptr<Object> addOperation(Add(forVar->clone(), new Integer(1)).evaluate()); Assign(forVar->clone(), addOperation.release()).execute(); } else { std::auto_ptr<Object> stepEval(step->evaluate()); if(stepEval->getType() != OBJ_INTEGER && stepEval->getType() != OBJ_REAL) throw InvalidTypeException(getLineNumber(), getColumnNumber(), OBJ_INTEGER | OBJ_REAL, stepEval->getType()); std::auto_ptr<Object> addOperation(Add(forVar->clone(), stepEval.release()).evaluate()); Assign(forVar->clone(), addOperation.release()).execute(); } // Check the until condition, if present if(untilCond != 0) { std::auto_ptr<Object> untilEval(untilCond->evaluate()); if(untilEval->getType() != OBJ_LOGICAL) throw InvalidTypeException(getLineNumber(), getColumnNumber(), OBJ_LOGICAL, untilEval->getType()); bool untilResult = static_cast<Logical*>(untilEval.get())->getValue(); if(untilResult) break; } } while(result.getStatus() == S_SUCCESS); return result; }