void joy_button(int button) { switch(button) { case 0: nextmove(); break; case 1: init(); break; } }
/* function implementations */ int main(void) { int c, x, y, p[2]; srand((unsigned int)time(NULL)); x = pos[0] = RAND(8); y = pos[1] = RAND(8); board[x][y] = -1; for(c = 2; c <= 64; ++c) { nextmove(p); x = pos[0] = p[0]; y = pos[1] = p[1]; board[x][y] = c; } show(); return 0; }
void movevtxs ( struct vtx_data **graph, /* data structure with vertex weights */ int nvtxs, /* number of vertices in graph */ int nsets, /* how many sets am I dividing into? */ double *dist, /* distances defining splitter */ int *indices[][MAXSETS], /* indices that define order in sorted lists */ double *vals[][MAXSETS], /* values in sorted lists */ int startvtx[][MAXSETS], /* index values corresponding to splitter */ int *sets, /* set assignment for each vertex */ double *size, /* sizes of the different sets */ double *goal, /* desired set sizes */ int vwgt_max /* largest vertex weight */ ) { double largest; /* largest overshoot from desired size */ double smallest; /* largest undershoot from desired size */ int active[MAXSETS]; /* flags sets trying to change size */ double delta; /* amount distances must change */ int vtx; /* vertex being moved */ int to, from; /* set vertex is being moved to/from */ int weight; /* weight of vertex being moved */ int done; /* have I successfully move a vertex? */ /* int npass=0; *//* counts passes through main loop */ int badset=-1; /* most unbalanced set */ int toobig=0; /* badset too large or too small? */ int balanced; /* is balance attained? */ double imbalance; /* amount of imbalance in badset */ int i; /* loop counter */ /* Find most unbalanced set. */ imbalance = largest = smallest = 0; for (i = 0; i < nsets; i++) { if (size[i] - goal[i] > largest) { largest = size[i] - goal[i]; if (largest > imbalance) { imbalance = largest; badset = i; toobig = 1; } } else if (goal[i] - size[i] > smallest) { smallest = goal[i] - size[i]; if (smallest > imbalance) { imbalance = smallest; badset = i; toobig = -1; } } } if (largest + smallest <= vwgt_max) balanced = TRUE; else balanced = FALSE; /* If not balanced, change distances to move vertices between sets. */ while (!balanced) { /* npass++; */ for (i = 0; i < nsets; i++) active[i] = FALSE; active[badset] = TRUE; done = FALSE; while (!done) { nextmove(nvtxs, nsets, vals, indices, startvtx, dist, sets, toobig, active, &vtx, &to, &delta); from = sets[vtx]; weight = graph[vtx]->vwgt; /* Now adjust all active dists to reflect this move so far. */ for (i = 0; i < nsets; i++) if (active[i]) dist[i] -= toobig * delta; if (toobig > 0) { if (size[to] + weight - goal[to] < largest) { done = TRUE; size[from] -= graph[vtx]->vwgt; size[to] += graph[vtx]->vwgt; sets[vtx] = to; undo_coupling(graph, sets, nsets, from, to, toobig, badset, size); } else { couple(nsets, from, to, vtx); active[to] = TRUE; } } else { if (goal[from] - (size[from] - weight) < smallest) { done = TRUE; size[from] -= graph[vtx]->vwgt; size[to] += graph[vtx]->vwgt; sets[vtx] = to; undo_coupling(graph, sets, nsets, from, to, toobig, badset, size); } else { couple(nsets, from, to, vtx); active[from] = TRUE; } } } /* Find most unbalanced set. */ imbalance = largest = smallest = 0; for (i = 0; i < nsets; i++) { if (size[i] - goal[i] > largest) { largest = size[i] - goal[i]; if (largest > imbalance) { imbalance = largest; badset = i; toobig = 1; } } else if (goal[i] - size[i] > smallest) { smallest = goal[i] - size[i]; if (smallest > imbalance) { imbalance = smallest; badset = i; toobig = -1; } } } if (largest + smallest <= vwgt_max) balanced = TRUE; else balanced = FALSE; } }
main() { int go[5], tvec[2]; int k, n, pid, ret, rpid, t; char s[100]; srand(time(0)); go[5] = NIL; fprintf(stdout, "Instructions? "); gets(s); if(*s == 'y') instructions(); putchar('\n'); fprintf(stdout, "Opponent's level: b - beginner,\n"); fprintf(stdout, "i - intermediate, e - expert? "); level='e'; gets(s); if(*s == 'b') level = 'b'; else if(*s == 'i') level = 'i'; putchar('\n'); fprintf(stdout, "You will play brown.\n\n"); fprintf(stdout, "Would you like to roll your own dice? "); gets(s); putchar('\n'); if(*s == 'y') nobroll = 1; fprintf(stdout, "Would you like to go first? "); gets(s); putchar('\n'); if(*s == 'y') goto nowhmove; whitesmv: roll(WHITE); fprintf(stdout, "white rolls %d, %d\n", die1, die2); fprintf(stdout, "white's move is:"); if(nextmove(white, brown) == NIL) goto nowhmove; if(piececount(white, 0, 24) == 0){ fprintf(stdout, "White wins"); if(piececount(brown, 0, 6) != 0) fprintf(stdout, " with a Backgammon!\n"); else if (piececount(brown, 0, 24) == 24) fprintf(stdout, " with a Gammon.\n"); else fprintf(stdout, ".\n"); exit(0); } nowhmove: if(pflg) prtbrd(); roll(BROWN); retry: fprintf(stdout, "\nYour roll is %d %d\n", die1, die2); fprintf(stdout, "Move? "); gets(s); switch(*s) { case '\0': /* empty line */ fprintf(stdout, "Brown's move skipped.\n"); goto whitesmv; case 'b': /* how many beared off? */ fprintf(stdout, "Brown: %d\n", piececount(brown, 0, 24) - 15); fprintf(stdout, "White: %d\n", piececount(white, 0, 24) - 15); goto retry; case 'p': /* print board */ prtbrd(); goto retry; case 's': /* stop auto printing of board */ pflg = 0; goto retry; case 'r': /* resume auto printing */ pflg = 1; goto retry; case 'm': /* print possible moves */ pmoves(); goto retry; case 'q': /* i give up */ exit(0); case '!': /* escape to Shell */ #ifdef ADD_A_MAJOR_SECURITY_HOLE if(s[1] != '\0') system(s+1); else #endif if (!(pid = vfork()) == 0) { (void)setuid(getuid()); (void)setgid(getgid()); execl("/bin/sh", "sh", "-", 0); fprintf(stderr, "back: cannot exec /bin/sh!\n"); exit(2); } while((rpid = wait(&ret)) != pid && rpid != -1) ; goto retry; case '?': /* well, what can i do? */ fprintf(stdout, "<newline> skip this move\n"); fprintf(stdout, "b number beared off\n"); fprintf(stdout, "p print board\n"); fprintf(stdout, "q quit\n"); fprintf(stdout, "r resume auto print of board\n"); fprintf(stdout, "s stop auto print of board\n"); fprintf(stdout, "! escape to Shell\n"); goto retry; } n = sscanf(s,"%d%d%d%d%d",&go[0],&go[1],&go[2],&go[3],&go[4]); if((die1 != die2 && n > 2) || n > 4){ fprintf(stdout, "Too many moves.\n"); goto retry; } go[n] = NIL; if(*s=='-'){ go[0]= -go[0]; t=die1; die1=die2; die2=t; } for(k = 0; k < n; k++){ if(0 <= go[k] && go[k] <= 24) continue; else{ fprintf(stdout, "Move %d illegal.\n", go[k]); goto retry; } } if(play(brown, white, go)) goto retry; if(piececount(brown, 0, 24) == 0){ fprintf(stdout, "Brown wins"); if(piececount(white, 0, 6) != 0) fprintf(stdout, " with a Backgammon.\n"); else if(piececount(white, 0, 24) == 24) fprintf(stdout, " with a gammon.\n"); else fprintf(stdout, ".\n"); exit(0); } goto whitesmv; }
Mob::Mob(int32_t oi, int32_t mid, int8_t mode, int8_t st, uint16_t fh, bool newspawn, int8_t tm, Point<int16_t> position) : MapObject(oi) { std::string strid = string_format::extend_id(mid, 7); nl::node src = nl::nx::mob[strid + ".img"]; nl::node info = src["info"]; level = info["level"]; watk = info["PADamage"]; matk = info["MADamage"]; wdef = info["PDDamage"]; mdef = info["MDDamage"]; accuracy = info["acc"]; avoid = info["eva"]; knockback = info["pushed"]; speed = info["speed"]; flyspeed = info["flySpeed"]; touchdamage = info["bodyAttack"].get_bool(); undead = info["undead"].get_bool(); noflip = info["noFlip"].get_bool(); notattack = info["notAttack"].get_bool(); canjump = src["jump"].size() > 0; canfly = src["fly"].size() > 0; canmove = src["move"].size() > 0 || canfly; if (canfly) { animations[STAND] = src["fly"]; animations[MOVE] = src["fly"]; } else { animations[STAND] = src["stand"]; animations[MOVE] = src["move"]; } animations[JUMP] = src["jump"]; animations[HIT] = src["hit1"]; animations[DIE] = src["die1"]; name = nl::nx::string["Mob.img"][std::to_string(mid)]["name"]; nl::node sndsrc = nl::nx::sound["Mob.img"][strid]; hitsound = sndsrc["Damage"]; diesound = sndsrc["Die"]; speed += 100; speed *= 0.001f; flyspeed += 100; flyspeed *= 0.0005f; if (canfly) phobj.type = PhysicsObject::FLYING; id = mid; team = tm; setposition(position); setcontrol(mode); phobj.fhid = fh; phobj.setflag(PhysicsObject::TURNATEDGES); hppercent = 0; dying = false; dead = false; fading = false; awaitdeath = false; setstance(st); flydirection = STRAIGHT; counter = 0; namelabel = Text(Text::A13M, Text::CENTER, Text::WHITE); namelabel.setback(Text::NAMETAG); namelabel.settext(name); if (newspawn) { fadein = true; opacity.set(0.0f); } else { fadein = false; opacity.set(1.0f); } if (control && stance == Stance::STAND) { nextmove(); } }
int8_t Mob::update(const Physics& physics) { if (!active) return phobj.fhlayer; bool aniend = animations.at(stance).update(); if (aniend && stance == DIE) { dead = true; } if (fading) { opacity -= 0.025f; if (opacity.last() < 0.025f) { opacity.set(0.0f); fading = false; dead = true; } } else if (fadein) { opacity += 0.025f; if (opacity.last() > 0.975f) { opacity.set(1.0f); fadein = false; } } if (dead) { active = false; return -1; } effects.update(); showhp.update(); if (!dying) { if (!canfly) { if (phobj.flagnotset(PhysicsObject::TURNATEDGES)) { flip = !flip; phobj.setflag(PhysicsObject::TURNATEDGES); if (stance == HIT) setstance(STAND); } } switch (stance) { case MOVE: if (canfly) { phobj.hforce = flip ? flyspeed : -flyspeed; switch (flydirection) { case UPWARDS: phobj.vforce = -flyspeed; break; case DOWNWARDS: phobj.vforce = flyspeed; break; } } else { phobj.hforce = flip ? speed : -speed; } break; case HIT: if (canmove) { double KBFORCE = phobj.onground ? 0.2 : 0.1; phobj.hforce = flip ? -KBFORCE : KBFORCE; } break; case JUMP: phobj.vforce = -5.0; break; } physics.moveobject(phobj); if (control) { counter++; bool next; switch (stance) { case HIT: next = counter > 200; break; case JUMP: next = phobj.onground; break; default: next = aniend && counter > 200; break; } if (next) { nextmove(); updatemovement(); counter = 0; } } } else { phobj.normalize(); physics.getfht().updatefh(phobj); } return phobj.fhlayer; }