| 1378 | void diveq(char *name, int *arg) { modifyvar(name, *arg, '/'); } COMMANDN(div=, diveq, "si"); |
| 1379 | |
| 1380 | void modifyfvar(const char *name, float arg, char op) |
| 1381 | { |
| 1382 | ident *id = idents->access(name); |
| 1383 | if(!id) return; |
| 1384 | if(identaccessdenied(id)) |
| 1385 | { |
| 1386 | conoutf("not allowed in this execution context: %s", id->name); |
| 1387 | scripterr(); |
| 1388 | return; |
| 1389 | } |
| 1390 | if((id->type == ID_VAR && id->minval > id->maxval) || (id->type == ID_FVAR && id->minvalf > id->maxvalf)) { conoutf("variable %s is read-only", id->name); return; } |
| 1391 | float val = 0; |
| 1392 | switch(id->type) |
| 1393 | { |
| 1394 | case ID_VAR: val = *id->storage.i; break; |
| 1395 | case ID_FVAR: val = *id->storage.f; break; |
| 1396 | case ID_SVAR: { { if(id->getfun) ((void (__cdecl *)())id->getfun)(); } val = atof(*id->storage.s); break; } |
| 1397 | case ID_ALIAS: val = atof(id->action); break; |
| 1398 | default: return; |
| 1399 | } |
| 1400 | switch(op) |
| 1401 | { |
| 1402 | case '+': val += arg; break; |
| 1403 | case '-': val -= arg; break; |
| 1404 | case '*': val *= arg; break; |
| 1405 | case '/': val = (arg == 0.0f) ? 0 : val / arg; break; |
| 1406 | } |
| 1407 | switch(id->type) |
| 1408 | { |
| 1409 | case ID_VAR: *id->storage.i = clamp((int)val, id->minval, id->maxval); break; |
| 1410 | case ID_FVAR: *id->storage.f = clamp(val, id->minvalf, id->maxvalf); break; |
| 1411 | case ID_SVAR: *id->storage.s = exchangestr(*id->storage.s, floatstr(val)); break; |
| 1412 | case ID_ALIAS: alias(name, floatstr(val)); return; |
| 1413 | } |
| 1414 | if(id->fun) ((void (__cdecl *)())id->fun)(); |
| 1415 | } |
| 1416 | |
| 1417 | void addeqf(char *name, float *arg) { modifyfvar(name, *arg, '+'); } COMMANDN(+=f, addeqf, "sf"); |
| 1418 | void subeqf(char *name, float *arg) { modifyfvar(name, *arg, '-'); } COMMANDN(-=f, subeqf, "sf"); |
no test coverage detected