+ if (e >= prog->entitypool_count) {
+ prog->vmerror++;
+ printf("Accessing out of bounds edict %i\n", (int)e);
+ e = 0;
+ }
+ return (qcany*)(prog->entitydata + (prog->entityfields * e));
+}
+
+qcint prog_spawn_entity(qc_program *prog)
+{
+ size_t i;
+ qcint e;
+ for (e = 0; e < (qcint)prog->entitypool_count; ++e) {
+ if (!prog->entitypool[e]) {
+ char *data = (char*)(prog->entitydata + (prog->entityfields * e));
+ memset(data, 0, prog->entityfields * sizeof(qcint));
+ return e;
+ }
+ }
+ if (!qc_program_entitypool_add(prog, true)) {
+ prog->vmerror++;
+ printf("Failed to allocate entity\n");
+ return 0;
+ }
+ prog->entities++;
+ for (i = 0; i < prog->entityfields; ++i) {
+ if (!qc_program_entitydata_add(prog, 0)) {
+ printf("Failed to allocate entity\n");
+ return 0;
+ }
+ }
+ return e;
+}
+
+void prog_free_entity(qc_program *prog, qcint e)
+{
+ if (!e) {
+ prog->vmerror++;
+ printf("Trying to free world entity\n");
+ return;
+ }
+ if (e >= prog->entitypool_count) {
+ prog->vmerror++;
+ printf("Trying to free out of bounds entity\n");
+ return;
+ }
+ if (!prog->entitypool[e]) {
+ prog->vmerror++;
+ printf("Double free on entity\n");
+ return;
+ }
+ prog->entitypool[e] = false;