//#TPT-Directive ElementHeader Element_ICEI static int update(UPDATE_FUNC_ARGS) int Element_ICEI::update(UPDATE_FUNC_ARGS) { //currently used for snow as well int r, rx, ry; if (parts[i].ctype==PT_FRZW)//get colder if it is from FRZW { parts[i].temp = restrict_flt(parts[i].temp-1.0f, MIN_TEMP, MAX_TEMP); } for (rx=-1; rx<2; rx++) for (ry=-1; ry<2; ry++) if (BOUNDS_CHECK && (rx || ry)) { r = pmap[y+ry][x+rx]; if (!r) continue; if (TYP(r)==PT_SALT || TYP(r)==PT_SLTW) { if (parts[i].temp > sim->elements[PT_SLTW].LowTemperature && RNG::Ref().chance(1, 200)) { sim->part_change_type(i,x,y,PT_SLTW); sim->part_change_type(ID(r),x+rx,y+ry,PT_SLTW); return 0; } } else if ((TYP(r)==PT_FRZZ) && RNG::Ref().chance(1, 200)) { sim->part_change_type(ID(r),x+rx,y+ry,PT_ICEI); parts[ID(r)].ctype = PT_FRZW; } } return 0; }
//#TPT-Directive ElementHeader Element_BMTL static int update(UPDATE_FUNC_ARGS) int Element_BMTL::update(UPDATE_FUNC_ARGS) { int r, rx, ry; if (parts[i].tmp>1) { parts[i].tmp--; for (rx=-1; rx<2; rx++) for (ry=-1; ry<2; ry++) if (BOUNDS_CHECK && (rx || ry)) { r = pmap[y+ry][x+rx]; if (!r) continue; if ((TYP(r)==PT_METL || TYP(r)==PT_IRON) && RNG::Ref().chance(1, 100)) { sim->part_change_type(ID(r),x+rx,y+ry,PT_BMTL); parts[ID(r)].tmp = (parts[i].tmp<=7) ? parts[i].tmp=1 : parts[i].tmp - RNG::Ref().between(0, 4); } } } else if (parts[i].tmp==1 && RNG::Ref().chance(1, 1000)) { parts[i].tmp = 0; sim->part_change_type(i,x,y,PT_BRMT); } return 0; }
//#TPT-Directive ElementHeader Element_WIFI static int update(UPDATE_FUNC_ARGS) int Element_WIFI::update(UPDATE_FUNC_ARGS) { int r, rx, ry; parts[i].tmp = (int)((parts[i].temp-73.15f)/100+1); if (parts[i].tmp>=CHANNELS) parts[i].tmp = CHANNELS-1; else if (parts[i].tmp<0) parts[i].tmp = 0; for (rx=-1; rx<2; rx++) for (ry=-1; ry<2; ry++) if (BOUNDS_CHECK && (rx || ry)) { r = pmap[y+ry][x+rx]; if (!r) continue; // wireless[][0] - whether channel is active on this frame // wireless[][1] - whether channel should be active on next frame if (sim->wireless[parts[i].tmp][0]) { if ((TYP(r)==PT_NSCN||TYP(r)==PT_PSCN||TYP(r)==PT_INWR)&&parts[ID(r)].life==0 && sim->wireless[parts[i].tmp][0]) { parts[ID(r)].ctype = TYP(r); sim->part_change_type(ID(r),x+rx,y+ry,PT_SPRK); parts[ID(r)].life = 4; } } if (TYP(r)==PT_SPRK && parts[ID(r)].ctype!=PT_NSCN && parts[ID(r)].life>=3) { sim->wireless[parts[i].tmp][1] = 1; sim->ISWIRE = 2; } } return 0; }
//#TPT-Directive ElementHeader Element_SHLD1 static int update(UPDATE_FUNC_ARGS) int Element_SHLD1::update(UPDATE_FUNC_ARGS) { int r, nnx, nny, rx, ry; for (rx=-1; rx<2; rx++) for (ry=-1; ry<2; ry++) if (BOUNDS_CHECK && (rx || ry)) { r = pmap[y+ry][x+rx]; if (!r) continue; else if (TYP(r)==PT_SPRK&&parts[i].life==0) { if (RNG::Ref().chance(11, 40)) { sim->part_change_type(i,x,y,PT_SHLD2); parts[i].life = 7; } for ( nnx=-1; nnx<2; nnx++) for ( nny=-1; nny<2; nny++) { if (!pmap[y+ry+nny][x+rx+nnx]) { sim->create_part(-1,x+rx+nnx,y+ry+nny,PT_SHLD1); //parts[ID(pmap[y+ny+nny][x+nx+nnx])].life=7; } } } else if (TYP(r) == PT_SHLD3 && RNG::Ref().chance(2, 5)) { sim->part_change_type(i,x,y,PT_SHLD2); parts[i].life = 7; } } return 0; }
//#TPT-Directive ElementHeader Element_GBMB static int update(UPDATE_FUNC_ARGS) int Element_GBMB::update(UPDATE_FUNC_ARGS) { int rx,ry,r; if (parts[i].life<=0) { for (rx=-1; rx<2; rx++) for (ry=-1; ry<2; ry++) { if (BOUNDS_CHECK) { r = pmap[y+ry][x+rx]; if(!r) continue; if(TYP(r)!=PT_BOMB && TYP(r)!=PT_GBMB && TYP(r)!=PT_CLNE && TYP(r)!=PT_PCLN && TYP(r)!=PT_DMND) { parts[i].life=60; break; } } } } if (parts[i].life>20) sim->gravmap[(y/CELL)*(XRES/CELL)+(x/CELL)] = 20; else if (parts[i].life>=1) sim->gravmap[(y/CELL)*(XRES/CELL)+(x/CELL)] = -80; return 0; }
//#TPT-Directive ElementHeader Element_HSWC static int update(UPDATE_FUNC_ARGS) int Element_HSWC::update(UPDATE_FUNC_ARGS) { int r, rx, ry; if (parts[i].life!=10) { if (parts[i].life>0) parts[i].life--; } else { for (rx=-2; rx<3; rx++) for (ry=-2; ry<3; ry++) if (BOUNDS_CHECK && (rx || ry)) { r = pmap[y+ry][x+rx]; if (parts[i].tmp == 1 && !r) r = sim->photons[y + ry][x + rx]; if (!r) continue; if (TYP(r)==PT_HSWC) { if (parts[ID(r)].life<10&&parts[ID(r)].life>0) parts[i].life = 9; else if (parts[ID(r)].life==0) parts[ID(r)].life = 10; } if (parts[i].tmp == 1 && (TYP(r) == PT_FILT || TYP(r) == PT_PHOT || TYP(r) == PT_BRAY)) { parts[i].temp = parts[ID(r)].ctype - 0x10000000; } } } return 0; }
void JniLogSystemCallback::operator()(AdblockPlus::LogSystem::LogLevel logLevel, const std::string& message, const std::string& source) { JNIEnvAcquire env(GetJavaVM()); jmethodID method = env->GetMethodID( *JniLocalReference<jclass>(*env, env->GetObjectClass(GetCallbackObject())), "logCallback", "(" TYP("LogSystem$LogLevel") "Ljava/lang/String;Ljava/lang/String;)V"); // TODO: Set log level from Java and handle it here (to reduce C++->Java calls) if (method) { const char* enumName = 0; switch (logLevel) { default: case AdblockPlus::LogSystem::LOG_LEVEL_TRACE: enumName = "TRACE"; break; case AdblockPlus::LogSystem::LOG_LEVEL_LOG: enumName = "LOG"; break; case AdblockPlus::LogSystem::LOG_LEVEL_INFO: enumName = "INFO"; break; case AdblockPlus::LogSystem::LOG_LEVEL_WARN: enumName = "WARN"; break; case AdblockPlus::LogSystem::LOG_LEVEL_ERROR: enumName = "ERROR"; break; } jclass enumClass = logLevelClass->Get(); if (enumClass) { jfieldID enumField = env->GetStaticFieldID(enumClass, enumName, TYP("LogSystem$LogLevel")); JniLocalReference<jobject> jLogLevel(*env, env->GetStaticObjectField(enumClass, enumField)); JniLocalReference<jstring> jMessage(*env, env->NewStringUTF(message.c_str())); JniLocalReference<jstring> jSource(*env, env->NewStringUTF(source.c_str())); env->CallVoidMethod(GetCallbackObject(), method, *jLogLevel, *jMessage, *jSource); } CheckAndLogJavaException(*env); } }
//#TPT-Directive ElementHeader Element_PSNS static int update(UPDATE_FUNC_ARGS) int Element_PSNS::update(UPDATE_FUNC_ARGS) { int r, rx, ry, rt; if ((parts[i].tmp == 0 && sim->pv[y/CELL][x/CELL] > parts[i].temp-273.15f) || (parts[i].tmp == 2 && sim->pv[y/CELL][x/CELL] < parts[i].temp-273.15f)) { parts[i].life = 0; for (rx = -2; rx <= 2; rx++) for (ry = -2; ry <= 2; ry++) if (BOUNDS_CHECK && (rx || ry)) { r = pmap[y+ry][x+rx]; if (!r) continue; if (sim->parts_avg(i,ID(r),PT_INSL) != PT_INSL) { rt = TYP(r); if ((sim->elements[rt].Properties&PROP_CONDUCTS) && !(rt==PT_WATR||rt==PT_SLTW||rt==PT_NTCT||rt==PT_PTCT||rt==PT_INWR) && parts[ID(r)].life==0) { parts[ID(r)].life = 4; parts[ID(r)].ctype = rt; sim->part_change_type(ID(r),x+rx,y+ry,PT_SPRK); } } } } if (parts[i].tmp == 1) { parts[i].life = 0; bool setFilt = true; float photonWl = sim->pv[y / CELL][x / CELL]; if (setFilt) { int nx, ny; for (rx = -1; rx <= 1; rx++) for (ry = -1; ry <= 1; ry++) if (BOUNDS_CHECK && (rx || ry)) { r = pmap[y + ry][x + rx]; if (!r) continue; nx = x + rx; ny = y + ry; while (TYP(r) == PT_FILT) { parts[ID(r)].ctype = 0x10000000 + roundl(photonWl) + 256; nx += rx; ny += ry; if (nx < 0 || ny < 0 || nx >= XRES || ny >= YRES) break; r = pmap[ny][nx]; } } } } return 0; }
//#TPT-Directive ElementHeader Element_PIPE static int update(UPDATE_FUNC_ARGS) int Element_PIPE::update(UPDATE_FUNC_ARGS) { int r, rx, ry, np; int rnd, rndstore; if (parts[i].ctype && !sim->elements[TYP(parts[i].ctype)].Enabled) parts[i].ctype = 0; if (parts[i].tmp & PPIP_TMPFLAG_TRIGGERS) { int pause_changed = 0; if (parts[i].tmp & PPIP_TMPFLAG_TRIGGER_ON) // TRIGGER_ON overrides TRIGGER_OFF { if (parts[i].tmp & PPIP_TMPFLAG_PAUSED) pause_changed = 1; parts[i].tmp &= ~PPIP_TMPFLAG_PAUSED; } else if (parts[i].tmp & PPIP_TMPFLAG_TRIGGER_OFF) { if (!(parts[i].tmp & PPIP_TMPFLAG_PAUSED)) pause_changed = 1; parts[i].tmp |= PPIP_TMPFLAG_PAUSED; } if (pause_changed) { int rx, ry, r; for (rx=-2; rx<3; rx++) for (ry=-2; ry<3; ry++) { if (BOUNDS_CHECK && (rx || ry)) { r = pmap[y+ry][x+rx]; if (TYP(r) == PT_BRCK) { if (parts[i].tmp & PPIP_TMPFLAG_PAUSED) parts[ID(r)].tmp = 0; else parts[ID(r)].tmp = 1; //make surrounding BRCK glow } } } } if (parts[i].tmp & PPIP_TMPFLAG_TRIGGER_REVERSE) { parts[i].tmp ^= PPIP_TMPFLAG_REVERSED; // Switch colors so it goes in reverse if ((parts[i].tmp&PFLAG_COLORS) != PFLAG_COLOR_GREEN) parts[i].tmp ^= PFLAG_COLOR_GREEN; if (parts[i].tmp & 0x100) //Switch one pixel pipe direction { int coords = (parts[i].tmp>>13)&0xF; int coords2 = (parts[i].tmp>>9)&0xF; parts[i].tmp &= ~0x1FE00; parts[i].tmp |= coords<<9; parts[i].tmp |= coords2<<13; }
//#TPT-Directive ElementHeader Element_AMTR static int update(UPDATE_FUNC_ARGS) int Element_AMTR::update(UPDATE_FUNC_ARGS) { int r, rx, ry, rt; for (rx=-1; rx<2; rx++) for (ry=-1; ry<2; ry++) if (BOUNDS_CHECK && (rx || ry)) { r = pmap[y+ry][x+rx]; if (!r) continue; rt = TYP(r); if (rt!=PT_AMTR && rt!=PT_DMND && rt!=PT_CLNE && rt!=PT_PCLN && rt!=PT_VOID && rt!=PT_BHOL && rt!=PT_NBHL && rt!=PT_PRTI && rt!=PT_PRTO) { parts[i].life++; if (parts[i].life==4) { sim->kill_part(i); return 1; } if (RNG::Ref().chance(1, 10)) sim->create_part(ID(r), x+rx, y+ry, PT_PHOT); else sim->kill_part(ID(r)); sim->pv[y/CELL][x/CELL] -= 2.0f; } } return 0; }
AnyType TPTScriptInterface::tptS_create(std::deque<String> * words) { //Arguments from stack AnyType createType = eval(words); PointType position = eval(words); Simulation * sim = m->GetSimulation(); int type; if(createType.GetType() == TypeNumber) type = ((NumberType)createType).Value(); else if(createType.GetType() == TypeString) type = m->GetSimulation()->GetParticleType(((StringType)createType).Value().ToUtf8()); else throw GeneralException("Invalid type"); if(type == -1) throw GeneralException("Invalid particle type"); ui::Point tempPoint = position.Value(); if(tempPoint.X<0 || tempPoint.Y<0 || tempPoint.Y >= YRES || tempPoint.X >= XRES) throw GeneralException("Invalid position"); int v = -1; if (ID(type)) { v = ID(type); type = TYP(type); } int returnValue = sim->create_part(-1, tempPoint.X, tempPoint.Y, type, v); return NumberType(returnValue); }
//#TPT-Directive ElementHeader Element_GPMP static int update(UPDATE_FUNC_ARGS) int Element_GPMP::update(UPDATE_FUNC_ARGS) { int r, rx, ry; if (parts[i].life!=10) { if (parts[i].life>0) parts[i].life--; } else { if (parts[i].temp>=256.0+273.15) parts[i].temp=256.0+273.15; if (parts[i].temp<= -256.0+273.15) parts[i].temp = -256.0+273.15; sim->gravmap[(y/CELL)*(XRES/CELL)+(x/CELL)] = 0.2f*(parts[i].temp-273.15); for (rx=-2; rx<3; rx++) for (ry=-2; ry<3; ry++) if (BOUNDS_CHECK && (rx || ry)) { r = pmap[y+ry][x+rx]; if (!r) continue; if (TYP(r)==PT_GPMP) { if (parts[ID(r)].life<10&&parts[ID(r)].life>0) parts[i].life = 9; else if (parts[ID(r)].life==0) parts[ID(r)].life = 10; } } } return 0; }
//#TPT-Directive ElementHeader Element_TTAN static int update(UPDATE_FUNC_ARGS) int Element_TTAN::update(UPDATE_FUNC_ARGS) { int ttan = 0; if (nt <= 2) ttan = 2; else if (parts[i].tmp) ttan = 2; else if (nt <= 6) { for (int rx = -1; rx <= 1; rx++) for (int ry = -1; ry <= 1; ry++) if ((!rx != !ry) && BOUNDS_CHECK) { if (TYP(pmap[y+ry][x+rx]) == PT_TTAN) ttan++; } } if (ttan >= 2) { sim->air->bmap_blockair[y/CELL][x/CELL] = 1; sim->air->bmap_blockairh[y/CELL][x/CELL] = 0x8; } return 0; }
void _st_ASKMOUNT_gt_() // <ASKMOUNT> { Exec("CR"); // call of word 0x26ee '(CR)' PRINT("Place disk containing file", 26); // (.") Exec("CR"); // call of word 0x26ee '(CR)' NAM(); // NAM Push(8); _dash_TRAILING(); // -TRAILING Exec("TYPE"); // call of word 0x2690 '(TYPE)' PRINT(".", 1); // (.") TYP(); // TYP Push(3); Exec("TYPE"); // call of word 0x2690 '(TYPE)' PRINT(" into ", 6); // (.") DRV(); // DRV Push(Read16(Pop())&0xFF); // C@ if (Read16(regsp) != 0) Push(Read16(regsp)); // ?DUP if (Pop() != 0) { PRINT("drive ", 6); // (.") Push(Pop() + 0x0040); // 0x0040 + Exec("EMIT"); // call of word 0x2731 '(EMIT)' } else { PRINT("any drive", 9); // (.") } Exec("CR"); // call of word 0x26ee '(CR)' PRINT("and press any key when ready.", 29); // (.") Exec("KEY_1"); // call of word 0x25d7 '(KEY)' Pop(); // DROP }
//#TPT-Directive ElementHeader Element_DLAY static int update(UPDATE_FUNC_ARGS) int Element_DLAY::update(UPDATE_FUNC_ARGS) { int r, rx, ry, oldl; oldl = parts[i].life; if (parts[i].life>0) parts[i].life--; if (parts[i].temp<= 1.0f+273.15f) parts[i].temp = 1.0f+273.15f; for (rx=-2; rx<3; rx++) for (ry=-2; ry<3; ry++) if (BOUNDS_CHECK && (rx || ry)) { r = pmap[y+ry][x+rx]; if (!r || sim->parts_avg(ID(r), i,PT_INSL)==PT_INSL) continue; if (TYP(r)==PT_SPRK && parts[i].life==0 && parts[ID(r)].life>0 && parts[ID(r)].life<4 && parts[ID(r)].ctype==PT_PSCN) { parts[i].life = (int)(parts[i].temp-273.15f+0.5f); } else if (TYP(r)==PT_DLAY) { if (!parts[i].life) { if (parts[ID(r)].life) { parts[i].life = parts[ID(r)].life; if((ID(r))>i) //If the other particle hasn't been life updated parts[i].life--; } } else if (!parts[ID(r)].life) { parts[ID(r)].life = parts[i].life; if((ID(r))>i) //If the other particle hasn't been life updated parts[ID(r)].life++; } } else if(TYP(r)==PT_NSCN && oldl==1) { sim->create_part(-1, x+rx, y+ry, PT_SPRK); } } //} return 0; }
/* Returns true for particles that start a ray search ("dtec" mode) */ bool accepted_type(Simulation* sim, int r) { int rt = TYP(r); if ((sim->elements[rt].Properties & PROP_CONDUCTS) && !(rt == PT_WATR || rt == PT_SLTW || rt == PT_NTCT || rt == PT_PTCT || rt == PT_INWR)) { if (sim->parts[ID(r)].life == 0) return true; } return false; }
//#TPT-Directive ElementHeader Element_WATR static int update(UPDATE_FUNC_ARGS) int Element_WATR::update(UPDATE_FUNC_ARGS) { int r, rx, ry; for (rx=-1; rx<2; rx++) for (ry=-1; ry<2; ry++) if (BOUNDS_CHECK && (rx || ry)) { r = pmap[y+ry][x+rx]; if (!r) continue; if (TYP(r)==PT_SALT && RNG::Ref().chance(1, 50)) { sim->part_change_type(i,x,y,PT_SLTW); // on average, convert 3 WATR to SLTW before SALT turns into SLTW if (RNG::Ref().chance(1, 3)) sim->part_change_type(ID(r),x+rx,y+ry,PT_SLTW); } else if ((TYP(r)==PT_RBDM||TYP(r)==PT_LRBD) && (sim->legacy_enable||parts[i].temp>(273.15f+12.0f)) && RNG::Ref().chance(1, 100)) { sim->part_change_type(i,x,y,PT_FIRE); parts[i].life = 4; parts[i].ctype = PT_WATR; } else if (TYP(r)==PT_FIRE && parts[ID(r)].ctype!=PT_WATR) { sim->kill_part(ID(r)); if (RNG::Ref().chance(1, 30)) { sim->kill_part(i); return 1; } } else if (TYP(r)==PT_SLTW && RNG::Ref().chance(1, 2000)) { sim->part_change_type(i,x,y,PT_SLTW); } } return 0; }
//#TPT-Directive ElementHeader Element_RIME static int update(UPDATE_FUNC_ARGS) int Element_RIME::update(UPDATE_FUNC_ARGS) { int r, rx, ry; for (rx=-1; rx<2; rx++) for (ry=-1; ry<2; ry++) if (BOUNDS_CHECK && (rx || ry)) { r = pmap[y+ry][x+rx]; if (!r) continue; if (TYP(r)==PT_SPRK) { sim->part_change_type(i,x,y,PT_FOG); parts[i].life = RNG::Ref().between(60, 119); } else if (TYP(r)==PT_FOG&&parts[ID(r)].life>0) { sim->part_change_type(i,x,y,PT_FOG); parts[i].life = parts[ID(r)].life; } } return 0; }
//#TPT-Directive ElementHeader Element_CONV static int update(UPDATE_FUNC_ARGS) int Element_CONV::update(UPDATE_FUNC_ARGS) { int r, rx, ry; int ctype = TYP(parts[i].ctype), ctypeExtra = ID(parts[i].ctype); if (ctype<=0 || ctype>=PT_NUM || !sim->elements[ctype].Enabled || ctype==PT_CONV || (ctype==PT_LIFE && (ctypeExtra<0 || ctypeExtra>=NGOL))) { for (rx=-1; rx<2; rx++) for (ry=-1; ry<2; ry++) if (BOUNDS_CHECK) { r = sim->photons[y+ry][x+rx]; if (!r) r = pmap[y+ry][x+rx]; if (!r) continue; int rt = TYP(r); if (rt != PT_CLNE && rt != PT_PCLN && rt != PT_BCLN && rt != PT_STKM && rt != PT_PBCN && rt != PT_STKM2 && rt != PT_CONV && rt < PT_NUM) { parts[i].ctype = rt; if (rt == PT_LIFE) parts[i].ctype |= PMAPID(parts[ID(r)].ctype); } } } else { int restrictElement = sim->IsValidElement(parts[i].tmp) ? parts[i].tmp : 0; for (rx=-1; rx<2; rx++) for (ry=-1; ry<2; ry++) if (x+rx>=0 && y+ry>=0 && x+rx<XRES && y+ry<YRES) { r = sim->photons[y+ry][x+rx]; if (!r || (restrictElement && TYP(r) != restrictElement)) r = pmap[y+ry][x+rx]; if (!r || (restrictElement && TYP(r) != restrictElement)) continue; if (TYP(r) != PT_CONV && TYP(r) != PT_DMND && TYP(r) != ctype) { sim->create_part(ID(r), x+rx, y+ry, TYP(parts[i].ctype), ID(parts[i].ctype)); } } } return 0; }
//#TPT-Directive ElementHeader Element_WARP static int update(UPDATE_FUNC_ARGS) int Element_WARP::update(UPDATE_FUNC_ARGS) { int trade, r, rx, ry; if (parts[i].tmp2>2000) { parts[i].temp = 10000; sim->pv[y/CELL][x/CELL] += (parts[i].tmp2/5000) * CFDS; if (!(rand()%50)) sim->create_part(-3, x, y, PT_ELEC); } for ( trade = 0; trade<5; trade ++) { rx = rand()%3-1; ry = rand()%3-1; if (BOUNDS_CHECK && (rx || ry)) { r = pmap[y+ry][x+rx]; if (!r) continue; if (TYP(r)!=PT_WARP&&TYP(r)!=PT_STKM&&TYP(r)!=PT_STKM2&&TYP(r)!=PT_DMND&&TYP(r)!=PT_CLNE&&TYP(r)!=PT_BCLN&&TYP(r)!=PT_PCLN) { parts[i].x = parts[ID(r)].x; parts[i].y = parts[ID(r)].y; parts[ID(r)].x = x; parts[ID(r)].y = y; parts[ID(r)].vx = (rand()%4)-1.5; parts[ID(r)].vy = (rand()%4)-2; parts[i].life += 4; pmap[y][x] = r; pmap[y+ry][x+rx] = PMAP(i, parts[i].type); trade = 5; } } } return 0; }
//#TPT-Directive ElementHeader Element_YEST static int update(UPDATE_FUNC_ARGS) int Element_YEST::update(UPDATE_FUNC_ARGS) { int r, rx, ry; for (rx=-1; rx<2; rx++) for (ry=-1; ry<2; ry++) if (BOUNDS_CHECK && (rx || ry)) { r = pmap[y+ry][x+rx]; if (!r) continue; if (TYP(r)==PT_DYST && RNG::Ref().chance(1, 6) && !sim->legacy_enable) { sim->part_change_type(i,x,y,PT_DYST); } } if (parts[i].temp > 303 && parts[i].temp < 317) { sim->create_part(-1, x + RNG::Ref().between(-1, 1), y + RNG::Ref().between(-1, 1), PT_YEST); } return 0; }
//#TPT-Directive ElementHeader Element_LSNS static int update(UPDATE_FUNC_ARGS) int Element_LSNS::update(UPDATE_FUNC_ARGS) { int r, rx, ry, rt, rd = parts[i].tmp2; if (rd > 25) parts[i].tmp2 = rd = 25; if (parts[i].life) { parts[i].life = 0; for (rx=-2; rx<3; rx++) for (ry=-2; ry<3; ry++) if (BOUNDS_CHECK && (rx || ry)) { r = pmap[y+ry][x+rx]; if (!r) continue; rt = TYP(r); if (sim->parts_avg(i,ID(r),PT_INSL) != PT_INSL) { if ((sim->elements[rt].Properties&PROP_CONDUCTS) && !(rt==PT_WATR||rt==PT_SLTW||rt==PT_NTCT||rt==PT_PTCT||rt==PT_INWR) && parts[ID(r)].life==0) { parts[ID(r)].life = 4; parts[ID(r)].ctype = rt; sim->part_change_type(ID(r),x+rx,y+ry,PT_SPRK); } } } } for (rx=-rd; rx<rd+1; rx++) for (ry=-rd; ry<rd+1; ry++) if (x+rx>=0 && y+ry>=0 && x+rx<XRES && y+ry<YRES && (rx || ry)) { r = pmap[y+ry][x+rx]; if(!r) r = sim->photons[y+ry][x+rx]; if(!r) continue; if (parts[ID(r)].life > parts[i].temp-273.15) parts[i].life = 1; } return 0; }
//#TPT-Directive ElementHeader Element_IGNT static int update(UPDATE_FUNC_ARGS) int Element_IGNT::update(UPDATE_FUNC_ARGS) { int r, rx, ry, rt; if(parts[i].tmp==0) { for (rx=-1; rx<2; rx++) for (ry=-1; ry<2; ry++) if (BOUNDS_CHECK && (rx || ry)) { r = pmap[y+ry][x+rx]; if (!r) continue; rt = TYP(r); if (rt==PT_FIRE || rt==PT_PLSM || rt==PT_SPRK || rt==PT_LIGH || (rt==PT_IGNT && parts[ID(r)].life==1)) { parts[i].tmp = 1; } } } else if(parts[i].life > 0) { if (RNG::Ref().chance(2, 3)) { int nb = sim->create_part(-1, x + RNG::Ref().between(-1, 1), y + RNG::Ref().between(-1, 1), PT_EMBR); if (nb!=-1) { parts[nb].tmp = 0; parts[nb].life = 30; parts[nb].vx = RNG::Ref().between(-10, 10); parts[nb].vy = RNG::Ref().between(-10, 10); parts[nb].temp = restrict_flt(parts[i].temp-273.15f+400.0f, MIN_TEMP, MAX_TEMP); } } else { sim->create_part(-1, x + RNG::Ref().between(-1, 1), y + RNG::Ref().between(-1, 1), PT_FIRE); } parts[i].life--; } return 0; }
static jobject JNICALL JniGetType(JNIEnv* env, jclass clazz, jlong ptr) { AdblockPlus::NotificationType type; try { type = GetNotificationPtr(ptr)->GetType(); } CATCH_THROW_AND_RETURN(env, 0) const char* enumName = 0; switch (type) { case AdblockPlus::NotificationType::NOTIFICATION_TYPE_CRITICAL: enumName = "CRITICAL"; break; case AdblockPlus::NotificationType::NOTIFICATION_TYPE_INFORMATION: enumName = "INFORMATION"; break; case AdblockPlus::NotificationType::NOTIFICATION_TYPE_QUESTION: enumName = "QUESTION"; break; default: enumName = "INVALID"; break; } JniLocalReference<jclass> enumClass( env, env->FindClass(PKG("Notification$Type"))); jfieldID enumField = env->GetStaticFieldID( *enumClass, enumName, TYP("Notification$Type")); return env->GetStaticObjectField(*enumClass, enumField); }
static jobject JNICALL JniGetType(JNIEnv* env, jclass clazz, jlong ptr) { AdblockPlus::Filter::Type type; try { type = GetFilterPtr(ptr)->GetType(); } CATCH_THROW_AND_RETURN(env, 0) const char* enumName = 0; switch (type) { case AdblockPlus::Filter::TYPE_BLOCKING: enumName = "BLOCKING"; break; case AdblockPlus::Filter::TYPE_COMMENT: enumName = "COMMENT"; break; case AdblockPlus::Filter::TYPE_ELEMHIDE: enumName = "ELEMHIDE"; break; case AdblockPlus::Filter::TYPE_ELEMHIDE_EXCEPTION: enumName = "ELEMHIDE_EXCEPTION"; break; case AdblockPlus::Filter::TYPE_EXCEPTION: enumName = "EXCEPTION"; break; default: enumName = "INVALID"; break; } JniLocalReference<jclass> enumClass(env, env->FindClass(PKG("Filter$Type"))); jfieldID enumField = env->GetStaticFieldID(*enumClass, enumName, TYP("Filter$Type")); return env->GetStaticObjectField(*enumClass, enumField); }
} static jlong JNICALL JniGetFilterEngineNativePtr(JNIEnv* env, jclass clazz, jlong ptr) { try { AdblockPlus::FilterEngine& engine = GetFilterEngineRef(ptr); return (jlong)&engine; } CATCH_THROW_AND_RETURN(env, 0); } static JNINativeMethod methods[] = { { (char*)"isFirstRun", (char*)"(J)Z", (void*)JniIsFirstRun }, { (char*)"getFilter", (char*)"(JLjava/lang/String;)" TYP("Filter"), (void*)JniGetFilter }, { (char*)"getListedFilters", (char*)"(J)Ljava/util/List;", (void*)JniGetListedFilters }, { (char*)"getSubscription", (char*)"(JLjava/lang/String;)" TYP("Subscription"), (void*)JniGetSubscription }, { (char*)"showNextNotification", (char*)"(JLjava/lang/String;)V", (void*)JniShowNextNotification }, { (char*)"setShowNotificationCallback", (char*)"(JJ)V", (void*)JniSetShowNotificationCallback }, { (char*)"removeShowNotificationCallback", (char*)"(J)V", (void*)JniRemoveShowNotificationCallback }, { (char*)"getListedSubscriptions", (char*)"(J)Ljava/util/List;", (void*)JniGetListedSubscriptions }, { (char*)"fetchAvailableSubscriptions", (char*)"(J)Ljava/util/List;", (void*)JniFetchAvailableSubscriptions }, { (char*)"setFilterChangeCallback", (char*)"(JJ)V", (void*)JniSetFilterChangeCallback }, { (char*)"removeFilterChangeCallback", (char*)"(J)V", (void*)JniRemoveFilterChangeCallback }, { (char*)"getElementHidingSelectors", (char*)"(JLjava/lang/String;)Ljava/util/List;", (void*)JniGetElementHidingSelectors }, { (char*)"getElementHidingEmulationSelectors", (char*)"(JLjava/lang/String;)Ljava/util/List;", (void*)JniGetElementHidingEmulationSelectors }, { (char*)"matches", (char*)"(JLjava/lang/String;" "[" TYP("FilterEngine$ContentType") "Ljava/lang/String;)" TYP("Filter"), (void*)JniMatches }, { (char*)"matches", (char*)"(JLjava/lang/String;" "[" TYP("FilterEngine$ContentType") "[Ljava/lang/String;)" TYP("Filter"), (void*)JniMatchesMany }, { (char*)"isDocumentWhitelisted", (char*)"(JLjava/lang/String;[Ljava/lang/String;)Z", (void*)JniIsDocumentWhitelisted }, { (char*)"isElemhideWhitelisted", (char*)"(JLjava/lang/String;[Ljava/lang/String;)Z", (void*)JniIsElemhideWhitelisted },
//#TPT-Directive ElementHeader Element_TSNS static int update(UPDATE_FUNC_ARGS) int Element_TSNS::update(UPDATE_FUNC_ARGS) { int rd = parts[i].tmp2; if (rd > 25) parts[i].tmp2 = rd = 25; if (parts[i].life) { parts[i].life = 0; for (int rx = -2; rx <= 2; rx++) for (int ry = -2; ry <= 2; ry++) if (BOUNDS_CHECK && (rx || ry)) { int r = pmap[y+ry][x+rx]; if (!r) continue; int rt = TYP(r); if (sim->parts_avg(i, ID(r), PT_INSL) != PT_INSL) { if ((sim->elements[rt].Properties&PROP_CONDUCTS) && !(rt == PT_WATR || rt == PT_SLTW || rt == PT_NTCT || rt == PT_PTCT || rt == PT_INWR) && parts[ID(r)].life == 0) { parts[ID(r)].life = 4; parts[ID(r)].ctype = rt; sim->part_change_type(ID(r), x+rx, y+ry, PT_SPRK); } } } } bool setFilt = false; int photonWl = 0; for (int rx = -rd; rx <= rd; rx++) for (int ry = -rd; ry <= rd; ry++) if (x + rx >= 0 && y + ry >= 0 && x + rx < XRES && y + ry < YRES && (rx || ry)) { int r = pmap[y+ry][x+rx]; if (!r) r = sim->photons[y+ry][x+rx]; if (!r) continue; if (parts[i].tmp == 0 && TYP(r) != PT_TSNS && TYP(r) != PT_METL && parts[ID(r)].temp > parts[i].temp) parts[i].life = 1; if (parts[i].tmp == 2 && TYP(r) != PT_TSNS && TYP(r) != PT_METL && parts[ID(r)].temp < parts[i].temp) parts[i].life = 1; if (parts[i].tmp == 1 && TYP(r) != PT_TSNS && TYP(r) != PT_FILT) { setFilt = true; photonWl = parts[ID(r)].temp; } } if (setFilt) { int nx, ny; for (int rx = -1; rx <= 1; rx++) for (int ry = -1; ry <= 1; ry++) if (BOUNDS_CHECK && (rx || ry)) { int r = pmap[y+ry][x+rx]; if (!r) continue; nx = x + rx; ny = y + ry; while (TYP(r) == PT_FILT) { parts[ID(r)].ctype = 0x10000000 + photonWl; nx += rx; ny += ry; if (nx < 0 || ny < 0 || nx >= XRES || ny >= YRES) break; r = pmap[ny][nx]; } } } return 0; }
//#TPT-Directive ElementHeader Element_PBCN static int update(UPDATE_FUNC_ARGS) int Element_PBCN::update(UPDATE_FUNC_ARGS) { int r, rx, ry, rt; if (!parts[i].tmp2 && sim->pv[y/CELL][x/CELL]>4.0f) parts[i].tmp2 = rand()%40+80; if (parts[i].tmp2) { parts[i].vx += ADVECTION*sim->vx[y/CELL][x/CELL]; parts[i].vy += ADVECTION*sim->vy[y/CELL][x/CELL]; parts[i].tmp2--; if(!parts[i].tmp2){ sim->kill_part(i); return 1; } } if (parts[i].ctype<=0 || parts[i].ctype>=PT_NUM || !sim->elements[parts[i].ctype].Enabled || (parts[i].ctype==PT_LIFE && (parts[i].tmp<0 || parts[i].tmp>=NGOL))) for (rx=-1; rx<2; rx++) for (ry=-1; ry<2; ry++) if (BOUNDS_CHECK) { r = sim->photons[y+ry][x+rx]; if (!r) r = pmap[y+ry][x+rx]; if (!r) continue; rt = TYP(r); if (rt!=PT_CLNE && rt!=PT_PCLN && rt!=PT_BCLN && rt!=PT_SPRK && rt!=PT_NSCN && rt!=PT_PSCN && rt!=PT_STKM && rt!=PT_STKM2 && rt!=PT_PBCN && rt<PT_NUM) { parts[i].ctype = rt; if (rt==PT_LIFE || rt==PT_LAVA) parts[i].tmp = parts[ID(r)].ctype; } } if (parts[i].life!=10) { if (parts[i].life>0) parts[i].life--; } else { for (rx=-2; rx<3; rx++) for (ry=-2; ry<3; ry++) if (BOUNDS_CHECK && (rx || ry)) { r = pmap[y+ry][x+rx]; if (!r) continue; if (TYP(r)==PT_PBCN) { if (parts[ID(r)].life<10&&parts[ID(r)].life>0) parts[i].life = 9; else if (parts[ID(r)].life==0) parts[ID(r)].life = 10; } } if (parts[i].ctype>0 && parts[i].ctype<PT_NUM && sim->elements[parts[i].ctype].Enabled) { if (parts[i].ctype==PT_PHOT) {//create photons a different way for (rx=-1; rx<2; rx++) for (ry = -1; ry < 2; ry++) if (rx || ry) { int r = sim->create_part(-1, x + rx, y + ry, PT_PHOT); if (r != -1) { parts[r].vx = rx * 3; parts[r].vy = ry * 3; if (r>i) { // Make sure movement doesn't happen until next frame, to avoid gaps in the beams of photons produced parts[r].flags |= FLAG_SKIPMOVE; } } } } else if (parts[i].ctype==PT_LIFE)//create life a different way for (rx=-1; rx<2; rx++) for (ry=-1; ry<2; ry++) sim->create_part(-1, x+rx, y+ry, PT_LIFE, parts[i].tmp); else if (parts[i].ctype!=PT_LIGH || !(rand()%30)) { int np = sim->create_part(-1, x+rand()%3-1, y+rand()%3-1, TYP(parts[i].ctype)); if (np>-1) { if (parts[i].ctype==PT_LAVA && parts[i].tmp>0 && parts[i].tmp<PT_NUM && sim->elements[parts[i].tmp].HighTemperatureTransition==PT_LAVA) parts[np].ctype = parts[i].tmp; } } } } return 0; }
//#TPT-Directive ElementHeader Element_H2 static int update(UPDATE_FUNC_ARGS) int Element_H2::update(UPDATE_FUNC_ARGS) { int r,rx,ry,rt; for (rx=-2; rx<3; rx++) for (ry=-2; ry<3; ry++) if (BOUNDS_CHECK && (rx || ry)) { r = pmap[y+ry][x+rx]; if (!r) continue; rt = TYP(r); if (sim->pv[y/CELL][x/CELL] > 8.0f && rt == PT_DESL) // This will not work. DESL turns to fire above 5.0 pressure { sim->part_change_type(ID(r),x+rx,y+ry,PT_WATR); sim->part_change_type(i,x,y,PT_OIL); return 1; } if (sim->pv[y/CELL][x/CELL] > 45.0f) { if (parts[ID(r)].temp > 2273.15) continue; } else { if (rt==PT_FIRE) { if(parts[ID(r)].tmp&0x02) parts[ID(r)].temp=3473.0f; else parts[ID(r)].temp=2473.15f; parts[ID(r)].tmp |= 1; sim->create_part(i,x,y,PT_FIRE); parts[i].temp += RNG::Ref().between(0, 99); parts[i].tmp |= 1; return 1; } else if ((rt==PT_PLSM && !(parts[ID(r)].tmp&4)) || (rt==PT_LAVA && parts[ID(r)].ctype != PT_BMTL)) { sim->create_part(i,x,y,PT_FIRE); parts[i].temp += RNG::Ref().between(0, 99); parts[i].tmp |= 1; return 1; } } } if (parts[i].temp > 2273.15 && sim->pv[y/CELL][x/CELL] > 50.0f) { if (RNG::Ref().chance(1, 5)) { int j; float temp = parts[i].temp; sim->create_part(i,x,y,PT_NBLE); parts[i].tmp = 0x1; j = sim->create_part(-3,x,y,PT_NEUT); if (j>-1) parts[j].temp = temp; if (RNG::Ref().chance(1, 10)) { j = sim->create_part(-3,x,y,PT_ELEC); if (j>-1) parts[j].temp = temp; } j = sim->create_part(-3,x,y,PT_PHOT); if (j>-1) { parts[j].ctype = 0x7C0000; parts[j].temp = temp; parts[j].tmp = 0x1; } rx = x + RNG::Ref().between(-1, 1), ry = y + RNG::Ref().between(-1, 1), rt = TYP(pmap[ry][rx]); if (sim->can_move[PT_PLSM][rt] || rt == PT_H2) { j = sim->create_part(-3,rx,ry,PT_PLSM); if (j>-1) { parts[j].temp = temp; parts[j].tmp |= 4; } } parts[i].temp = temp + RNG::Ref().between(750, 1249); sim->pv[y/CELL][x/CELL] += 30; return 1; } } return 0; }
int luatpt_set_property(lua_State* l) { const char *name; int r, i, x, y, w, h, t = 0, nx, ny, partsel = 0; float f = 0; int acount = lua_gettop(l); const char* prop = luaL_optstring(l, 1, ""); CommandInterface::FormatType format; int offset = luacon_ci->GetPropertyOffset(prop, format); if (offset == -1) return luaL_error(l, "Invalid property '%s'", prop); if (acount > 2) { if(!lua_isnumber(l, acount) && lua_isstring(l, acount)) { name = luaL_optstring(l, acount, "none"); if ((partsel = luacon_sim->GetParticleType(ByteString(name))) == -1) return luaL_error(l, "Unrecognised element '%s'", name); } } if (lua_isnumber(l, 2)) { if (format == CommandInterface::FormatFloat) f = luaL_optnumber(l, 2, 0); else t = luaL_optint(l, 2, 0); if (!strcmp(prop, "type") && (t<0 || t>=PT_NUM || !luacon_sim->elements[t].Enabled)) return luaL_error(l, "Unrecognised element number '%d'", t); } else if (lua_isstring(l, 2)) { name = luaL_checklstring(l, 2, NULL); if ((t = luacon_sim->GetParticleType(ByteString(name)))==-1) return luaL_error(l, "Unrecognised element '%s'", name); } else luaL_error(l, "Expected number or element name as argument 2"); if (!lua_isnumber(l, 3) || acount >= 6) { // Got a region if (acount < 6) { i = 0; y = 0; w = XRES; h = YRES; } else { i = abs(luaL_checkint(l, 3)); y = abs(luaL_checkint(l, 4)); w = abs(luaL_checkint(l, 5)); h = abs(luaL_checkint(l, 6)); } if (i>=XRES || y>=YRES) return luaL_error(l, "Coordinates out of range (%d,%d)", i, y); x = i; if(x+w > XRES) w = XRES-x; if(y+h > YRES) h = YRES-y; Particle * parts = luacon_sim->parts; for (i = 0; i < NPART; i++) { if (parts[i].type) { nx = (int)(parts[i].x + .5f); ny = (int)(parts[i].y + .5f); if (nx >= x && nx < x+w && ny >= y && ny < y+h && (!partsel || partsel == parts[i].type)) { if (format == CommandInterface::FormatElement) luacon_sim->part_change_type(i, nx, ny, t); else if(format == CommandInterface::FormatFloat) *((float*)(((unsigned char*)&luacon_sim->parts[i])+offset)) = f; else *((int*)(((unsigned char*)&luacon_sim->parts[i])+offset)) = t; } } } } else { i = abs(luaL_checkint(l, 3)); // Got coords or particle index if (lua_isnumber(l, 4)) { y = abs(luaL_checkint(l, 4)); if (i>=XRES || y>=YRES) return luaL_error(l, "Coordinates out of range (%d,%d)", i, y); r = luacon_sim->pmap[y][i]; if (!r || (partsel && partsel != TYP(r))) r = luacon_sim->photons[y][i]; if (!r || (partsel && partsel != TYP(r))) return 0; i = ID(r); } if (i < 0 || i >= NPART) return luaL_error(l, "Invalid particle ID '%d'", i); if (!luacon_sim->parts[i].type) return 0; if (partsel && partsel != luacon_sim->parts[i].type) return 0; if (format == CommandInterface::FormatElement) luacon_sim->part_change_type(i, luacon_sim->parts[i].x, luacon_sim->parts[i].y, t); else if (format == CommandInterface::FormatFloat) *((float*)(((unsigned char*)&luacon_sim->parts[i])+offset)) = f; else *((int*)(((unsigned char*)&luacon_sim->parts[i])+offset)) = t; } return 0; }