void PointStarfield::addBrightStarCatalogue (int count) { assert(count >= 0); if (count < BrightStarCatalogueSize) { // Only sort if we don't add everything. // It would be lovely if the catalogue was already sorted. std::vector<std::pair<Real, int> > vec; vec.reserve(BrightStarCatalogueSize); for (int i = 0; i < BrightStarCatalogueSize; ++i) { vec.push_back(std::make_pair(BrightStarCatalogue[i].magn, i)); } sort(vec.begin(), vec.end()); for (int i = 0; i < count; ++i) { addStar(BrightStarCatalogue[vec[i].second]); } } else { assert(count == BrightStarCatalogueSize); for (int i = 0; i < BrightStarCatalogueSize; ++i) { addStar(BrightStarCatalogue[i]); } } notifyStarVectorChanged (); }
void ItemFactory::produce(float dt) { //produce food when necessary addFood(); //add the transfer doors //load from json //addDoor(); //add the score apple addApple(dt); //add the speed star addStar(dt); //add the slow down ball addBall(dt); //check and remove expired item removeExpiredItem(dt); }
bool MapFlag::initWithLevel(int level) { instance = GameManager::getInstance(); setLevel(level); if (!Sprite::init()) { return false; } switch (UserDefault::getInstance()->getIntegerForKey(String::createWithFormat(instance->LEVELX_STARNUM,getLevel())->getCString(),0)) { case(0)://得星个数为0,为完成 setType(0); flag = Sprite::createWithSpriteFrameName("mapFlag_0022.png"); break; case(4)://得星个数为4 setType(2); flag = Sprite::createWithSpriteFrameName("mapFlag_0112.png"); break; case(5)://得星个数为5 setType(3); wings = Sprite::createWithSpriteFrameName("mapFlag_wings_0015.png"); addChild(wings); flag = Sprite::createWithSpriteFrameName("mapFlag_0112.png"); break; default: setType(1); flag = Sprite::createWithSpriteFrameName("mapFlag_0094.png"); break; } addChild(flag); initStar(); addStar(); auto listener = EventListenerTouchOneByOne::create(); listener->onTouchBegan = CC_CALLBACK_2(MapFlag::onTouchBegan, this); listener->onTouchEnded = CC_CALLBACK_2(MapFlag::onTouchEnded, this); _eventDispatcher->addEventListenerWithSceneGraphPriority(listener,flag); return true; }
//生成比较的语句,结果只能为INTEGER? void genCompare(Quad* quad, VariableMap* map) { fprintf(out, "\t# compare\n"); if (quad->addr3.kind == String && getVar(quad->addr3.contents.name, map)) { addStar(quad->addr3.contents.name); quad->addr3.kind = Val; } if (quad->addr2.kind == String && getVar(quad->addr2.contents.name, map)) { quad->addr2.kind = Val; addStar(quad->addr2.contents.name); } if (quad->addr1.kind == String && getVar(quad->addr1.contents.name, map)) { quad->addr1.kind = Val; addStar(quad->addr1.contents.name); } type t1 = UNDEFINED, t2 = UNDEFINED, t=UNDEFINED; if (quad->addr1.kind==Val) t1 = getType(quad->addr1.contents.name+1, map); else switch (quad->addr1.kind) { case IntConst: t1 = INTEGER; break; case FloatConst: t1 = FLOAT; break; default: break; } if (quad->addr2.kind==Val) t2 = getType(quad->addr2.contents.name+1, map); else switch (quad->addr2.kind) { case IntConst: t2 = INTEGER; break; case FloatConst: t2 = FLOAT; break; default: break; } if (t1==DOUBLE || t2 == DOUBLE) t=DOUBLE; else if (t1==FLOAT || t2 == FLOAT) t = FLOAT; else if (t1==INTEGER && t2==INTEGER) t = INTEGER; if (t == INTEGER) { //如果 a = b op c的b和c都是整形 if (quad->addr1.kind == IntConst) fprintf(out, "\tli $t1, %d\n", quad->addr1.contents.intVal); if (quad->addr1.kind == Val) { fprintf(out, "\tlw $t3, %s\n", quad->addr1.contents.name+1); fprintf(out, "\tlw $t1, 0($t3)\n"); } if (quad->addr2.kind == IntConst) fprintf(out, "\tli $t2, %d\n", quad->addr2.contents.intVal); if (quad->addr2.kind == Val) { fprintf(out, "\tlw $t3, %s\n", quad->addr2.contents.name+1); fprintf(out, "\tlw $t2, 0($t3)\n"); } if (quad->op == sm) fprintf(out, "\tslt $t3, $t1, $t2\n"); //如果c=a<b且a确实小于b则t0=1否则t0=0 if (quad->op == gt) fprintf(out, "\tslt $t3, $t2, $t1\n"); if (quad->op == ne) { fprintf(out, "\tslt $t4, $t1, $t2\n"); fprintf(out, "\tslt $t5, $t2, $t1\n"); fprintf(out, "\tor $t3, $t4, $t5\n"); } if (quad->op == eq) { fprintf(out, "\tslt $t4, $t1, $t2\n"); fprintf(out, "\tslt $t5, $t2, $t1\n"); fprintf(out, "\tnor $t3, $t4, $t5\n"); fprintf(out, "\tandi $t3, $t3, 1\n"); } } if (t == FLOAT) { if (quad->addr1.kind == IntConst) fprintf(out, "\tli.s $f0, %d.0\n", quad->addr1.contents.intVal); if (quad->addr1.kind == FloatConst) fprintf(out, "\tli.s $f0, %f\n", quad->addr1.contents.floatVal); if (quad->addr1.kind == Val) { t1 = getType(quad->addr1.contents.name+1, map); fprintf(out, "\tlw $t3, %s\n", quad->addr1.contents.name+1); if (t1 == FLOAT) fprintf(out, "\tl.s $f0, 0($t3)\n"); if (t1 == INTEGER) { fprintf(out, "lw $t1, 0($t3)\n"); fprintf(out, "\tmtc1 $t1, $f0\n"); fprintf(out, "\tcvt.s.w $f0, $f0\n"); } } if (quad->addr2.kind == IntConst) fprintf(out, "\tli.s $f2, %d.0\n", quad->addr2.contents.intVal); if (quad->addr2.kind == FloatConst) fprintf(out, "\tli.s $f2, %f\n", quad->addr2.contents.floatVal); if (quad->addr2.kind == Val) { //要强制转换类型 t2 = getType(quad->addr2.contents.name+1, map); fprintf(out, "\tlw $t3, %s\n", quad->addr2.contents.name+1); if (t2 == FLOAT) fprintf(out, "\tl.s $f2, 0($t3)\n"); if (t2 == INTEGER) { fprintf(out, "\tlw $t2, 0($t3)\n"); fprintf(out, "\tmtc1 $t2, $f2\n"); fprintf(out, "\tcvt.s.w $f2, $f2\n"); } } if (quad->op == sm) fprintf(out, "\tc.lt.s 0, $f0, $f2\n"); if (quad->op == gt) fprintf(out, "\tc.lt.s 0, $f2, $f0\n"); if (quad->op == eq) fprintf(out, "\tc.eq.s 0, $f0, $f2\n"); if (quad->op == ne) fprintf(out, "\tc.neq.s 0, $f2, $f0\n"); fprintf(out, "\tli $t5, 1\n"); fprintf(out, "\tli, $t3, 0\n"); fprintf(out, "\tmovt $t3, $t5, 0\n"); } if (t == DOUBLE) { if (quad->addr1.kind == IntConst) fprintf(out, "\tli.d $f0, %d.0\n", quad->addr1.contents.intVal); if (quad->addr1.kind == FloatConst) fprintf(out, "\tli.d $f0, %f\n", quad->addr1.contents.floatVal); if (quad->addr1.kind == Val) { t1 = getType(quad->addr1.contents.name+1, map); fprintf(out, "\tlw $t3, %s\n", quad->addr1.contents.name+1); if (t1 == INTEGER) { fprintf(out, "\tlw $t1, 0($t3)\n"); fprintf(out, "\tmtc1 $t1, $f0\n"); fprintf(out, "\tcvt.s.w $f0, $f0\n"); fprintf(out, "\tcvt.d.s $f0, $f0\n"); } if (t1 == FLOAT) { fprintf(out, "\tl.s $f0, 0($t3)\n"); fprintf(out, "\tcvt.d.s $f0, $f0\n"); } if (t1 == DOUBLE) fprintf(out, "\tl.d $f0, 0($t3)\n"); } if (quad->addr2.kind == IntConst) fprintf(out, "\tli.d $f2, %d.0\n", quad->addr2.contents.intVal); if (quad->addr2.kind == FloatConst) fprintf(out, "\tli.d $f2, %f\n", quad->addr2.contents.floatVal); if (quad->addr2.kind == Val) { t2 = getType(quad->addr2.contents.name+1, map); fprintf(out, "\tlw $t3, %s\n", quad->addr2.contents.name+1); if (t2 == INTEGER) { fprintf(out, "\tlw $t2, 0($t3)\n"); fprintf(out, "\tmtc1 $t2, $f2\n"); fprintf(out, "\tcvt.s.w $f2, $f2\n"); fprintf(out, "\tcvt.d.s $f2, $f2\n"); } if (t2 == FLOAT) { fprintf(out, "\tl.s $f2, 0($t3)\n"); fprintf(out, "\tcvt.d.s $f2, $f2\n"); } if (t2 == DOUBLE) fprintf(out, "\tl.d $f2, 0($t3)\n"); } if (quad->op == sm) fprintf(out, "\tc.lt.d 0, $f0, $f2\n"); if (quad->op == gt) fprintf(out, "\tc.lt.d 0, $f2, $f0\n"); if (quad->op == eq) fprintf(out, "\tc.eq.d 0, $f0, $f2\n"); if (quad->op == eq) fprintf(out, "\tc.neq.d 0, $f0, $f2\n"); fprintf(out, "\tli $t5, 1\n"); fprintf(out, "\tli, $t3, 0\n"); fprintf(out, "\tmovt $t3, $t5, 0\n"); } if (strcmp(quad->addr3.contents.name, "$t7")==0) { fprintf(out, "\tadd $t7, $t3, $0\n"); return; } t = getType(quad->addr3.contents.name+1, map); fprintf(out, "\tlw $t2, %s\n", quad->addr3.contents.name+1); if (t == INTEGER) fprintf(out, "\tsw $t3, 0($t2)\n"); if (t == FLOAT) { fprintf(out, "\tmtc1 $t3, $f0\n"); fprintf(out, "\tcvt.s.w $f0, $f0\n"); fprintf(out, "\ts.s $f0, 0($t2)"); } if (t == DOUBLE) { fprintf(out, "\tmtc1 $t3, $f0\n"); fprintf(out, "\tcvt.s.w $f0, $f0\n"); fprintf(out, "\tcvt.d.s $f0, $f0\n"); fprintf(out, "\ts.d $f0, 0($t2)\n"); } if (quad->addr3.kind == Val && getVar(quad->addr3.contents.name, map)) { removeStar(quad->addr3.contents.name); quad->addr3.kind = String; } if (quad->addr2.kind == Val && getVar(quad->addr2.contents.name, map)) { quad->addr2.kind = String; removeStar(quad->addr2.contents.name); } if (quad->addr1.kind == Val && getVar(quad->addr1.contents.name, map)) { quad->addr1.kind = String; removeStar(quad->addr1.contents.name); } }
//将加、减、乘法的三地址码语句转化为mips(已支持浮点数) void genCAL(Quad* quad, VariableMap* map) { fprintf(out, "\t# calculation\n"); if (strcmp(quad->addr1.contents.name, "sp")==0) { if (quad->op == add) fprintf(out,"\taddi, $sp, $sp, %d\n", quad->addr2.contents.intVal); if (quad->op == sub) fprintf(out,"\taddi, $sp, $sp, -%d\n", quad->addr2.contents.intVal); return; } type t1 = UNDEFINED, t2 = UNDEFINED, t3 = UNDEFINED; if (quad->addr3.kind == String && getVar(quad->addr3.contents.name, map)) { addStar(quad->addr3.contents.name); quad->addr3.kind = Val; } if (quad->addr2.kind == String && getVar(quad->addr2.contents.name, map)) { quad->addr2.kind = Val; addStar(quad->addr2.contents.name); } if (quad->addr1.kind == String && getVar(quad->addr1.contents.name, map)) { quad->addr1.kind = Val; addStar(quad->addr1.contents.name); } if (quad->addr3.kind == String) { //关于地址的计算 if (quad->addr1.kind == IntConst) fprintf(out, "\tli $t1, %d\n", quad->addr1.contents.intVal); if (quad->addr1.kind == String) fprintf(out, "\tlw $t1, %s\n", quad->addr1.contents.name); if (quad->addr2.kind == IntConst) fprintf(out, "\tli $t2, %d\n", quad->addr2.contents.intVal); if (quad->addr2.kind == String) fprintf(out, "\tlw $t2, %s\n", quad->addr2.contents.name); if (quad->op == add) fprintf(out, "\tadd $t1, $t1, $t2\n"); if (quad->op == sub) fprintf(out, "\tsub $t1, $t1, $t2\n"); fprintf(out, "\tsw $t1, %s\n", quad->addr3.contents.name); } if (quad->addr3.kind == Val) { //关于值的计算 t3 = getType(quad->addr3.contents.name+1, map); if (t3 == INTEGER) { if (quad->addr1.kind == IntConst) fprintf(out, "\tli $t1, %d\n", quad->addr1.contents.intVal); if (quad->addr1.kind == Val) { fprintf(out, "\tlw $t3, %s\n", quad->addr1.contents.name+1); fprintf(out, "\tlw $t1, 0($t3)\n"); } if (quad->addr2.kind == IntConst) fprintf(out, "\tli $t2, %d\n", quad->addr2.contents.intVal); if (quad->addr2.kind == Val) { fprintf(out, "\tlw $t3, %s\n", quad->addr2.contents.name+1); fprintf(out, "\tlw $t2, 0($t3)\n"); } if (quad->op == add) fprintf(out, "\tadd $t1, $t1, $t2\n"); if (quad->op == sub) fprintf(out, "\tsub $t1, $t1, $t2\n"); if (quad->op == mul) fprintf(out, "\tmul $t1, $t1, $t2\n"); if (quad->op == dvd) fprintf(out, "\tdiv $t1, $t2\n"); if (quad->op != dvd) { fprintf(out, "\tlw $t3, %s\n", quad->addr3.contents.name+1); fprintf(out, "\tsw $t1, 0($t3)\n"); } if (quad->op == dvd) { fprintf(out, "\tlw $t3, %s\n", quad->addr3.contents.name+1); fprintf(out, "\tmflo $t2\n"); fprintf(out, "\tsw $t2 0($t3)\n"); } } if (t3 == FLOAT) { if (quad->addr1.kind == IntConst) fprintf(out, "\tli.s $f1, %d.0\n", quad->addr1.contents.intVal); if (quad->addr1.kind == FloatConst) fprintf(out, "\tli.s $f1, %f\n", quad->addr1.contents.floatVal); if (quad->addr1.kind == Val) { t1 = getType(quad->addr1.contents.name+1, map); fprintf(out, "\tlw $t3, %s\n", quad->addr1.contents.name+1); if (t1 == FLOAT) fprintf(out, "\tl.s $f1, 0($t3)\n"); if (t1 == INTEGER) { fprintf(out, "lw $t1, 0($t3)\n"); fprintf(out, "\tmtc1 $t1, $f1\n"); fprintf(out, "\tcvt.s.w $f1, $f1\n"); } } if (quad->addr2.kind == IntConst) fprintf(out, "\tli.s $f2, %d.0\n", quad->addr2.contents.intVal); if (quad->addr2.kind == FloatConst) fprintf(out, "\tli.s $f2, %f\n", quad->addr2.contents.floatVal); if (quad->addr2.kind == Val) { //要强制转换类型 t2 = getType(quad->addr2.contents.name+1, map); fprintf(out, "\tlw $t3, %s\n", quad->addr2.contents.name+1); if (t2 == FLOAT) fprintf(out, "\tl.s $f2, 0($t3)\n"); if (t2 == INTEGER) { fprintf(out, "\tlw $t2, 0($t3)\n"); fprintf(out, "\tmtc1 $t2, $f2\n"); fprintf(out, "\tcvt.s.w $f2, $f2\n"); } } if (quad->op == add) fprintf(out, "\tadd.s $f3, $f1, $f2\n"); if (quad->op == sub) fprintf(out, "\tsub.s $f3, $f1, $f2\n"); if (quad->op == mul) fprintf(out, "\tmul.s $f3, $f1, $f2\n"); if (quad->op == dvd) fprintf(out, "\tdiv.s $f3, $f1, $f2\n"); fprintf(out, "\tlw $t3, %s\n", quad->addr3.contents.name+1); fprintf(out, "\ts.s $f3, 0($t3)\n"); } if (t3 == DOUBLE) { if (quad->addr1.kind == IntConst) fprintf(out, "\tli.d $f0, %d.0\n", quad->addr1.contents.intVal); if (quad->addr1.kind == FloatConst) fprintf(out, "\tli.d $f0, %f\n", quad->addr1.contents.floatVal); if (quad->addr1.kind == Val) { t1 = getType(quad->addr1.contents.name+1, map); fprintf(out, "\tlw $t3, %s\n", quad->addr1.contents.name+1); if (t1 == INTEGER) { fprintf(out, "\tlw $t1, 0($t3)\n"); fprintf(out, "\tmtc1 $t1, $f0\n"); fprintf(out, "\tcvt.s.w $f0, $f0\n"); fprintf(out, "\tcvt.d.s $f0, $f0\n"); } if (t1 == FLOAT) { fprintf(out, "\tl.s $f0, 0($t3)\n"); fprintf(out, "\tcvt.d.s $f0, $f0\n"); } if (t1 == DOUBLE) fprintf(out, "\tl.d $f0, 0($t3)\n"); } if (quad->addr2.kind == IntConst) fprintf(out, "\tli.d $f2, %d.0\n", quad->addr2.contents.intVal); if (quad->addr2.kind == FloatConst) fprintf(out, "\tli.d $f2, %f\n", quad->addr2.contents.floatVal); if (quad->addr2.kind == Val) { t2 = getType(quad->addr2.contents.name+1, map); fprintf(out, "\tlw $t3, %s\n", quad->addr2.contents.name+1); if (t2 == INTEGER) { fprintf(out, "\tlw $t2, 0($t3)\n"); fprintf(out, "\tmtc1 $t2, $f2\n"); fprintf(out, "\tcvt.s.w $f2, $f2\n"); fprintf(out, "\tcvt.d.s $f2, $f2\n"); } if (t2 == FLOAT) { fprintf(out, "\tl.s $f2, 0($t3)\n"); fprintf(out, "\tcvt.d.s $f2, $f2\n"); } if (t2 == DOUBLE) fprintf(out, "\tl.d $f2, 0($t3)\n"); } if (quad->op == add) fprintf(out, "\tadd.d $f4, $f0, $f2\n"); if (quad->op == sub) fprintf(out, "\tsub.d $f4, $f0, $f2\n"); if (quad->op == mul) fprintf(out, "\tmul.d $f4, $f0, $f2\n"); if (quad->op == dvd) fprintf(out, "\tdiv.d $f4, $f0, $f2\n"); fprintf(out, "\tlw $t3, %s\n", quad->addr3.contents.name+1); fprintf(out, "\ts.d $f4, 0($t3)\n"); } } if (quad->addr3.kind == Val && getVar(quad->addr3.contents.name, map)) { removeStar(quad->addr3.contents.name); quad->addr3.kind = String; } if (quad->addr2.kind == Val && getVar(quad->addr2.contents.name, map)) { quad->addr2.kind = String; removeStar(quad->addr2.contents.name); } if (quad->addr1.kind == Val && getVar(quad->addr1.contents.name, map)) { quad->addr1.kind = String; removeStar(quad->addr1.contents.name); } }
//将赋值的三地址码语句转化为mips(已支持浮点数) void genASN(Quad* quad, VariableMap* map) { fprintf(out, "\t# assign\n"); // type t1 = UNDEFINED; if (quad->addr2.kind == String && getVar(quad->addr2.contents.name, map)) { quad->addr2.kind = Val; addStar(quad->addr2.contents.name); } if (quad->addr1.kind == String && getVar(quad->addr1.contents.name, map)) { quad->addr1.kind = Val; addStar(quad->addr1.contents.name); } if (strcmp(quad->addr1.contents.name, "*sp")==0) { type t1 = getType(quad->addr2.contents.name+1, map); if (t1 == INTEGER) { fprintf(out, "\tlw $t0, 0($sp)\n"); fprintf(out, "\tlw $t1, %s\n", quad->addr2.contents.name+1); fprintf(out, "\tsw, $t0, 0($t1)\n"); } if (t1 == FLOAT) { fprintf(out, "\tl.s $f0, 0($sp)\n"); fprintf(out, "\tl.s $t1, %s\n", quad->addr2.contents.name+1); fprintf(out, "\ts.s, $f0, 0($t1)\n"); } if (t1 == DOUBLE) { fprintf(out, "\tl.d $f0, 0($sp)\n"); fprintf(out, "\tl.d $t1, %s\n", quad->addr2.contents.name+1); fprintf(out, "\ts.d, $f0, 0($t1)\n"); } } else if (quad->addr2.kind == String) { if (quad->addr1.kind == IntConst) fprintf(out, "\tli $t1, %d\n", quad->addr1.contents.intVal); if (quad->addr1.kind == String) fprintf(out, "\tlw $t1, %s\n", quad->addr1.contents.name); fprintf(out, "\tsw $t1, %s\n", quad->addr2.contents.name); } else if (quad->addr2.kind == Val) { type t2 = getType(quad->addr2.contents.name+1, map); if (t2 == INTEGER) { if (quad->addr1.kind == IntConst) fprintf(out, "\tli $t0, %d\n", quad->addr1.contents.intVal); if (quad->addr1.kind == Val) { fprintf(out, "\tlw $t0, %s\n", quad->addr1.contents.name+1); fprintf(out, "\tlw $t0, 0($t0)\n"); } fprintf(out, "\tlw $t1, %s\n", quad->addr2.contents.name+1); fprintf(out, "\tsw $t0, 0($t1)\n"); } if (t2 == FLOAT) { if (quad->addr1.kind == IntConst) { fprintf(out, "\tli $t0, %d\n", quad->addr1.contents.intVal); fprintf(out, "\tmtc1, $t0, $f0\n"); fprintf(out, "\tcvt.s.w $f0, $f0\n"); } if (quad->addr1.kind == FloatConst) fprintf(out, "\tli.s $f0, %f\n", quad->addr1.contents.floatVal); if (quad->addr1.kind == Val) { fprintf(out, "\tlw $t0, %s\n", quad->addr1.contents.name+1); if (getType(quad->addr1.contents.name+1, map)==FLOAT) fprintf(out, "\tl.s $f0, 0($t0)\n"); if (getType(quad->addr1.contents.name+1, map)==INTEGER) { fprintf(out, "\tlw $t0, 0($t0)\n"); fprintf(out, "\tmtc1, $t0, $f0\n"); fprintf(out, "\tcvt.s.w $f0, $f0\n"); } } fprintf(out, "\tlw $t0, %s\n", quad->addr2.contents.name+1); fprintf(out, "\ts.s $f0, 0($t0)\n"); } if (t2 == DOUBLE) { if (quad->addr1.kind == IntConst) { fprintf(out, "\tli $t0, %d\n", quad->addr1.contents.intVal); fprintf(out, "\tmtc1, $t0, $f0\n"); fprintf(out, "\tcvt.s.w $f0, $f0\n"); fprintf(out, "\tcvt.d.s $f0, $f0\n"); } if (quad->addr1.kind == FloatConst) { fprintf(out, "\tli.s $f0, %f\n", quad->addr1.contents.floatVal); fprintf(out, "\tcvt.d.s, $f0, $f0\n"); } if (quad->addr1.kind == Val) { fprintf(out, "\tlw $t0, %s\n", quad->addr1.contents.name+1); if (getType(quad->addr1.contents.name+1, map)==FLOAT) { fprintf(out, "\tl.s $f0, 0($t0)\n"); fprintf(out, "\tcvt.d.s, $f0, $f0"); } if (getType(quad->addr1.contents.name+1, map)==INTEGER) { fprintf(out, "\tlw $t0, 0($t0)\n"); fprintf(out, "\tmtc1 $t0, $f0\n"); fprintf(out, "\tcvt.s.w $f0, $f0\n"); fprintf(out, "\tcvt.d.s $f0, $f0\n"); } if (getType(quad->addr1.contents.name+1, map)==DOUBLE) fprintf(out, "\tl.d $f0, 0($t0)\n"); } fprintf(out, "\tlw $t0, %s\n", quad->addr2.contents.name+1); fprintf(out, "\ts.d $f0, 0($t0)\n"); } } if (quad->addr2.kind == Val && getVar(quad->addr2.contents.name, map)) { quad->addr2.kind = String; removeStar(quad->addr2.contents.name); } if (quad->addr1.kind == Val && getVar(quad->addr1.contents.name, map)) { quad->addr1.kind = String; removeStar(quad->addr1.contents.name); } }
Match *Kernel::match(Nodemaster *node, Nodemaster *parent, int state, const string &input, const string &star, const string &path) { StringTokenizer st(input); if (st.countTokens() == 0) { if (node->hasTemplate()) { Match *m = new Match(); m->setNode(node); m->addTopicStar(trim(star)); m->setTopicPattern(trim(path)); return m; } return NULL; } string word = st.nextToken(); string uWord = toUpper(word); string tail = ""; Match *m = NULL; if (st.hasMoreTokens()) { tail = trim(input.substr(word.length())); } int index = constants.find(" " + word + " "); if (index != string::npos) { if (node->getChild(uWord) != NULL) { m = match(node->getChild(uWord), node, state + 1, tail, "", ""); if (m != NULL) { addStar(m, trim(star), state); addPath(m, trim(path), state); } } return m; } if (node->getChild("_") != NULL) { m = match(node->getChild("_"), node, state, tail, word, path + " _"); if (m != NULL) { addStar(m, trim(star), state); return m; } } if (node->getChild(uWord) != NULL) { m = match(node->getChild(uWord), node, state, tail, star, path + " " + word); if (m != NULL) { return m; } } if (node->getChild("@") != NULL) { // This one is a bit of a mystery to get figured out //Vector queries = node.getQueries(); //for (int ix = 0; ix < queries.size(); ++ix) { //String type = (String)queries.elementAt(ix); //if (lookup(type, star.trim()) == true) { //m = match(node.getChild("@" + type), node, state, tail, word, path + " @" + type); //if (m != null) { //addStar(m, star.trim(), state); //return m; //} //} //} } if (node->getChild("*") != NULL) { m = match(node->getChild("*"), node, state, tail, word, path + " *"); if (m != NULL) { addStar(m, trim(star), state); return m; } } if (node == parent->getChild("*") || node == parent->getChild("_") || node == parent->getChild("@")) { return match(node, parent, state, tail, star + " " + word, path); } return NULL; }
static void moveWormhole( struct state *st, wormhole * worm ) { int q; double dx, dy; /* int x1, y1, x2, y2; */ int min_dist = 100; int find = 0; dx = Cos( worm->ang ) * worm->speed; dy = Sine( worm->ang ) * worm->speed; worm->virtualx += dx; worm->virtualy += dy; worm->actualx = (int)worm->virtualx; worm->actualy = (int)worm->virtualy; if ( worm->spiral ){ if ( worm->spiral % 5 == 0 ) worm->ang = (worm->ang + 1 ) % 360; worm->spiral--; if ( worm->spiral <= 0 ) find = 1; } else { if ( dist( worm->actualx, worm->actualy, worm->want_x, worm->want_y ) < 20 ) find = 1; if ( rnd( 20 ) == rnd( 20 ) ) find = 1; if ( worm->actualx < min_dist ){ worm->actualx = min_dist; worm->virtualx = worm->actualx; find = 1; } if ( worm->actualy < min_dist ){ worm->actualy = min_dist; worm->virtualy = worm->actualy; find = 1; } if ( worm->actualx > st->SCREEN_X - min_dist ){ worm->actualx = st->SCREEN_X - min_dist; worm->virtualx = worm->actualx; find = 1; } if ( worm->actualy > st->SCREEN_Y - min_dist ){ worm->actualy = st->SCREEN_Y - min_dist; worm->virtualy = worm->actualy; find = 1; } if ( rnd( 500 ) == rnd( 500 ) ) worm->spiral = rnd( 30 ) + 50; } if ( find ){ worm->want_x = rnd( st->SCREEN_X - min_dist * 2 ) + min_dist; worm->want_y = rnd( st->SCREEN_Y - min_dist * 2 ) + min_dist; worm->ang = gang( worm->actualx, worm->actualy, worm->want_x, worm->want_y ); } /* worm->ang = ( worm->ang + 360 + rnd( 30 ) - 15 ) % 360; */ /* if ( worm->ang < worm->want_ang ) worm->ang++; if ( worm->ang > worm->want_ang ) worm->ang--; if ( worm->ang == worm->want_ang && rnd( 3 ) == rnd( 3 ) ) worm->want_ang = rnd( 360 ); */ /* if ( rnd( 25 ) == rnd( 25 ) ){ x1 = worm->actualx; y1 = worm->actualy; x2 = SCREEN_X / 2 + rnd( 20 ) - 10; y2 = SCREEN_Y / 2 + rnd( 20 ) - 10; worm->want_ang = gang(x1,y1,x2,y2); } */ /* if ( worm->actualx < min_dist || worm->actualx > SCREEN_X - min_dist || worm->actualy < min_dist || worm->actualy > SCREEN_Y - min_dist ){ x1 = worm->actualx; y1 = worm->actualy; x2 = SCREEN_X / 2 + rnd( 20 ) - 10; y2 = SCREEN_Y / 2 + rnd( 20 ) - 10; / * worm->ang = gang( worm->actualx, worm->actualy, SCREEN_X/2+rnd(20)-10, SCREEN_Y/2+rnd(20)-10 ); * / worm->ang = gang( x1, y1, x2, y2 ); worm->want_ang = worm->ang; / * printf("Angle = %d\n", worm->ang ); * / if ( worm->actualx < min_dist ) worm->actualx = min_dist; if ( worm->actualx > SCREEN_X - min_dist ) worm->actualx = SCREEN_X - min_dist; if ( worm->actualy < min_dist ) worm->actualy = min_dist; if ( worm->actualy > SCREEN_Y - min_dist ) worm->actualy = SCREEN_Y - min_dist; worm->virtualx = worm->actualx; worm->virtualy = worm->actualy; } */ for ( q = 0; q < worm->num_stars; q++ ){ if ( worm->stars[q] != NULL ){ if ( moveStar( st, worm->stars[q] ) ){ free( worm->stars[q] ); worm->stars[q] = NULL; } } } moveColorChanger( &worm->changer ); if ( worm->diameter < worm->diameter_change ) worm->diameter++; if ( worm->diameter > worm->diameter_change ) worm->diameter--; if ( rnd( 30 ) == rnd( 30 ) ) worm->diameter_change = rnd( 35 ) + 5; for ( q = 0; q < worm->addStar; q++ ) addStar( worm ); }
void Stars(struct RUNPARAMS *param, struct CPUINFO *cpu, REAL dt, REAL aexp, int level, int is){ // ----------------------------------------------------------// /// The stars creation function.\n /// Scan if cell is allowed to form star\n /// If true, compute how many star are needed\n /// and add them to the linked list\n // ----------------------------------------------------------// #ifdef GSLRAND const gsl_rng_type * T; gsl_rng * r; gsl_rng_env_setup(); T = gsl_rng_default; r = gsl_rng_alloc (T); param->stars->rpoiss=r; #endif if(cpu->rank == RANK_DISP) printf("STARS\n"); setStarsState(param, cpu, level); REAL mmax = 0; REAL percentvol =0; int n_unit_stars = 0; int n_part_stars = 0; int nstarsmax_in_one_cell=0; int nstarsmin_in_one_cell=1e3; initThresh(param, aexp); REAL mstars_level = setmStar(param,level); int iOct; for(iOct=0; iOct<cpu->locNoct[level-1]; iOct++){ struct OCT *curoct=cpu->octList[level-1][iOct]; int icell; for(icell=0;icell<8;icell++) { struct CELL *curcell = &curoct->cell[icell]; if( testCond(curcell, param, aexp, level) ) { REAL dx = POW(2.0,-level); REAL xc=curoct->x+( icell & 1)*dx+dx*0.5; REAL yc=curoct->y+((icell>>1)& 1)*dx+dx*0.5; REAL zc=curoct->z+( icell>>2 )*dx+dx*0.5; percentvol += POW(dx,3); int N = getNstars2create(curcell, param, dt, aexp, level,mstars_level); nstarsmax_in_one_cell = FMAX(nstarsmax_in_one_cell,N); nstarsmin_in_one_cell = FMIN(nstarsmin_in_one_cell,N); if(N>0.2*param->npartmax){ printf("You are about to create more stars than 20 percent of npartmax N=%d nmax=%d on proc %d\n",(int)N,param->npartmax,cpu->rank); if(N>param->npartmax){ printf("You are about to create more stars than npartmax N=%d nmax=%d on proc %d--> ABORT\n",(int)N,param->npartmax,cpu->rank); abort(); } } // if(N) printf("N_Rho_Temp_Seuil_z\t%d\t%e\t%e\t%e\t%e\n", N, curcell->field.d, curcell->rfield.temp, param->stars->thresh,1.0/aexp - 1.0 ); #ifdef MULTIPLESTARS struct Wtype init_state=curcell->field; int ipart; for (ipart=0;ipart< N; ipart++){ addStar(curcell, &init_state, level, xc, yc, zc, cpu, dt, param, aexp, is,n_part_stars++, mstars_level); n_unit_stars++; } #else #ifdef CONTINUOUSSTARS REAL m = getMstars2create(curcell, param, dt, aexp, level); //if(m>mstars_level) { addStar(curcell, &curcell->field, level, xc, yc, zc, cpu, dt, param, aexp, is,n_part_stars++, m); n_unit_stars++; } #else if(N){ addStar(curcell, &curcell->field, level, xc, yc, zc, cpu, dt, param, aexp, is,n_part_stars++, N*mstars_level); n_unit_stars++; } #endif // CONTINUOUSSTARS #endif // MULTIPLESTARS /* if (N){ printWtype(&init_state); printWtype(&curcell->field); } */ } mmax = FMAX(curcell->field.d, mmax); } } #ifdef WMPI MPI_Allreduce(MPI_IN_PLACE,&n_unit_stars,1,MPI_INT,MPI_SUM,cpu->comm); MPI_Allreduce(MPI_IN_PLACE,&n_part_stars,1,MPI_INT,MPI_SUM,cpu->comm); MPI_Allreduce(MPI_IN_PLACE,&mmax,1,MPI_REEL,MPI_MAX,cpu->comm); MPI_Allreduce(MPI_IN_PLACE,&percentvol,1,MPI_REEL,MPI_SUM,cpu->comm); MPI_Allreduce(MPI_IN_PLACE,&nstarsmax_in_one_cell,1,MPI_INT,MPI_MAX,cpu->comm); MPI_Allreduce(MPI_IN_PLACE,&nstarsmin_in_one_cell,1,MPI_INT,MPI_MIN,cpu->comm); #endif param->stars->n += n_part_stars; if(cpu->rank==RANK_DISP) { printf("Mmax=%e\tthresh=%e\tvol=%e\n", mmax, param->stars->thresh, percentvol ); if (n_unit_stars){ printf("%d stars added in %d particles on level %d --> min=%d max=%d \n", n_unit_stars, n_part_stars, level,nstarsmin_in_one_cell,nstarsmax_in_one_cell); printf("%d stars particles in total\n",param->stars->n); } if(cpu->trigstar==0 && param->stars->n>0) printf("FIRST_STARS at z=%e\n",1./aexp-1.); if(param->stars->n>0) cpu->trigstar=1; } #ifdef GSLRAND gsl_rng_free (r); #endif }