ref: 596459dd77e5c3e66a57be31e711a58624024881
dir: /sim.spawn.c/
#include <u.h>
#include <libc.h>
#include <draw.h>
#include "dat.h"
#include "fns.h"
Mobj *
derefmobj(int idx, long uuid)
{
int n;
Mobj *mo;
Team *t;
n = idx >> Teamshift & Nteam - 1;
if(n < 0 || n > nteam){
werrstr("invalid team number %d", n);
return nil;
}
t = teams + n;
n = idx & Teamidxmask;
if(n >= t->mobj.n || (mo = ((Mobj **)t->mobj.p)[n]) == nil){
werrstr("mobj index %d out of bounds or missing", n);
return nil;
}
if(mo->idx != idx || mo->uuid != uuid){
werrstr("phase error: %#ux,%ld ≠ %M %#ux,%ld",
idx, uuid, mo, mo->idx, mo->uuid);
return nil;
}
return mo;
}
int
spawnunit(Obj *o, Point p, int team)
{
Mobj *mo;
if((mo = mapspawn(o, p)) == nil)
return -1;
mo->team = team;
mo->θ = frand() * 256;
mo->hp = o->hp;
idlestate(mo);
refmobj(mo);
return 0;
}
int
spawnresource(Obj *o, Point p, int amount)
{
Mobj *mo;
if(amount <= 0){
werrstr("spawnresource: invalid amount");
return -1;
}
if((mo = mapspawn(o, p)) == nil)
return -1;
mo->team = 0;
mo->amount = amount;
resourcestate(mo);
refmobj(mo);
return 0;
}