Ejemplo n.º 1
0
void WMFUpdateState::NewSourceVars(void)
{
	OUTLINE_POINT Org;
	OUTLINE_POINT Ext;
	Org.x = (short)m_DCState.m_cpWindowOrg.x;
	Org.y = (short)m_DCState.m_cpWindowOrg.y;
	Ext.x = (short)m_DCState.m_cpWindowExt.x;
	Ext.y = (short)m_DCState.m_cpWindowExt.y;

	// Handle viewport scaling.
	if (m_DCState.m_cpViewportScaleNum.x != 0)
		Ext.x = scale_number(Ext.x, m_DCState.m_cpViewportScaleDenom.x, m_DCState.m_cpViewportScaleNum.x);
	if (m_DCState.m_cpViewportScaleNum.y != 0)
		Ext.y = scale_number(Ext.y, m_DCState.m_cpViewportScaleDenom.y, m_DCState.m_cpViewportScaleNum.y);

	if (Ext.x < 0)
	{
		Org.x += Ext.x;
		Ext.x = -Ext.x;
		reverse_x_transform = !reverse_x_transform;
	}
	if (Ext.y < 0)
	{
		Org.y += Ext.y;
		Ext.y = -Ext.y;
		reverse_y_transform = !reverse_y_transform;
	}

	// set_source_extent wants upper left, lower right. Switch from org, ext.
	Ext.x += Org.x;
	Ext.y += Org.y;
	set_source_extent(Org, Ext);
}
Ejemplo n.º 2
0
static void test_fishing_feeds_2_people(CuTest * tc)
{
    const resource_type *rtype;
    region *r;
    faction *f;
    unit *u;
    ship *sh;
    
    test_cleanup();
    test_create_world();
    r = findregion(-1, 0);
    CuAssertStrEquals(tc, "ocean", r->terrain->_name);    /* test_create_world needs coverage */
    f = test_create_faction(rc_find("human"));
    u = test_create_unit(f, r);
    sh = new_ship(st_find("boat"), r, 0);
    u_set_ship(u, sh);
    rtype = get_resourcetype(R_SILVER);
    i_change(&u->items, rtype->itype, 42);
    
    scale_number(u, 1);
    sh->flags |= SF_FISHING;
    get_food(r);
    CuAssertIntEquals(tc, 42, i_get(u->items, rtype->itype));

    scale_number(u, 2);
    sh->flags |= SF_FISHING;
    get_food(r);
    CuAssertIntEquals(tc, 42, i_get(u->items, rtype->itype));

    scale_number(u, 3);
    sh->flags |= SF_FISHING;
    get_food(r);
    CuAssertIntEquals(tc, 32, i_get(u->items, rtype->itype));
}
Ejemplo n.º 3
0
/**
 ** GM: KILL FACTION <id> <string>
 ** requires: permission-key "gmmsgr"
 **/
static void gm_killfaction(const void *tnext, struct unit *u, struct order *ord)
{
  int n = getid();
  faction *f = findfaction(n);
  const char *msg = getstrtoken();
  plane *p = rplane(u->region);
  attrib *permissions = a_find(u->faction->attribs, &at_permissions);
  if (!permissions || !has_permission(permissions, atoi36("gmkill"))) {
    mistake(u, ord, "permission denied.");
    return;
  }
  if (f != NULL) {
    region *r;
    for (r = regions; r; r = r->next)
      if (rplane(r) == p) {
        unit *target;
        for (target = r->units; target; target = target->next) {
          if (target->faction == f) {
            scale_number(target, 0);
            ADDMSG(&target->faction->msgs, msg_message("killedbygm",
                "region unit string", r, target, msg));
            return;
          }
        }
      }
  }
  mistake(u, ord, "cannot remove a unit from this faction.");
}
Ejemplo n.º 4
0
void drown(region * r)
{
  if (fval(r->terrain, SEA_REGION)) {
    unit **up = up = &r->units;
    while (*up) {
      unit *u = *up;
      int amphibian_level = 0;
      if (u->ship || u_race(u) == get_race(RC_SPELL) || u->number == 0) {
        up = &u->next;
        continue;
      }

      if (amphibian_level) {
        int dead = damage_unit(u, "5d1", false, false);
        if (dead) {
          ADDMSG(&u->faction->msgs, msg_message("drown_amphibian_dead",
              "amount unit region", dead, u, r));
        } else {
          ADDMSG(&u->faction->msgs, msg_message("drown_amphibian_nodead",
              "unit region", u, r));
        }
      } else if (!(canswim(u) || canfly(u))) {
        scale_number(u, 0);
        ADDMSG(&u->faction->msgs, msg_message("drown", "unit region", u, r));
      }
      if (*up == u)
        up = &u->next;
    }
    remove_empty_units_in_region(r);
  }
}
Ejemplo n.º 5
0
/* Change the scale of n to s.  Reducing scale may truncate the mantissa */
void
normalize(struct number *n, u_int s)
{

	scale_number(n->number, s - n->scale);
	n->scale = s;
}
Ejemplo n.º 6
0
static void test_shipspeed_max_range(CuTest *tc) {
    ship *sh;
    ship_type *stype;
    region *r;
    struct faction *f;
    unit *cap, *crew;

    test_setup();
    sh = setup_ship();
    setup_crew(sh, 0, &cap, &crew);
    config_set("movement.shipspeed.skillbonus", "5");
    r = sh->region;
    f = test_create_faction(NULL);
    assert(r && f);
    stype = st_get_or_create(sh->type->_name);

    set_level(cap, SK_SAILING, stype->cptskill + 4);
    set_level(crew, SK_SAILING, (stype->sumskill - stype->cptskill) * 4);
    CuAssertIntEquals_Msg(tc, "skill bonus requires at least movement.shipspeed.skillbonus points", 2, shipspeed(sh, cap));

    set_level(cap, SK_SAILING, stype->cptskill + 5);
    set_level(crew, SK_SAILING, (stype->sumskill - stype->cptskill) * 5);
    CuAssertIntEquals_Msg(tc, "skill bonus from movement.shipspeed.skillbonus", 3, shipspeed(sh, cap));

    set_level(cap, SK_SAILING, stype->cptskill + 15);
    scale_number(crew, 15);
    set_level(crew, SK_SAILING, stype->sumskill - stype->cptskill);
    CuAssertIntEquals_Msg(tc, "skill-bonus cannot exceed max_range", 4, shipspeed(sh, cap));
    test_teardown();
}
Ejemplo n.º 7
0
void make_zombie(unit * u)
{
  u_setfaction(u, get_monsters());
  scale_number(u, 1);
  u_setrace(u, new_race[RC_ZOMBIE]);
  u->irace = NULL;
}
Ejemplo n.º 8
0
void save_special_items(unit *usrc)
{
    unit *u;
    region *r = usrc->region;
    faction *fm = get_monsters();
    static const race *rc_ghost;
    static int cache;

    if (rc_changed(&cache)) {
        rc_ghost = get_race(RC_TEMPLATE);
    }
    for (u = r->units; u; u = u->next) {
        if (u->faction == fm) {
            give_special_items(u, &usrc->items);
            return;
        }
    }
    u = create_unit(r, fm, 1, rc_ghost, 0, NULL, NULL);
    unit_setname(u, unit_getname(usrc));
    if (usrc->number > 1) {
        /* some units have plural names, it would be neat if they aren't single: */
        scale_number(u, 2);
    }
    set_racename(&u->attribs, "ghost");
    give_special_items(u, &usrc->items);
}
Ejemplo n.º 9
0
void make_zombie(unit * u)
{
    u_setfaction(u, get_monsters());
    scale_number(u, 1);
    u->hp = unit_max_hp(u) * u->number;
    u_setrace(u, get_race(RC_ZOMBIE));
    u->irace = NULL;
}
Ejemplo n.º 10
0
void age_firedragon(unit * u)
{
  if (u->number > 0 && rng_int() % 100 < age_chance(u->age, DRAGONAGE, 1)) {
    double q = (double)u->hp / (double)(unit_max_hp(u) * u->number);
    u_setrace(u, new_race[RC_DRAGON]);
    u->irace = NULL;
    scale_number(u, 1);
    u->hp = (int)(unit_max_hp(u) * u->number * q);
  }
}
Ejemplo n.º 11
0
void age_ghoul(unit * u)
{
  if (is_monsters(u->faction) && rng_int() % 100 < age_chance(u->age, 27, 1)) {
    int n = _max(1, u->number / 2);
    double q = (double)u->hp / (double)(unit_max_hp(u) * u->number);
    u_setrace(u, get_race(RC_GHOUL_LORD));
    u->irace = NULL;
    scale_number(u, n);
    u->hp = (int)(unit_max_hp(u) * u->number * q);
  }
}
Ejemplo n.º 12
0
void age_zombie(unit * u)
{
    if (is_monsters(u->faction) && rng_int() % 100 < age_chance(u->age, 27, 1)) {
        int n = u->number / 2;
        double q = (double)u->hp / (double)(unit_max_hp(u) * u->number);
        if (n < 1) n = 1;
        u_setrace(u, get_race(RC_ZOMBIE_LORD));
        u->irace = NULL;
        scale_number(u, n);
        u->hp = (int)(unit_max_hp(u) * u->number * q);
    }
}
Ejemplo n.º 13
0
static void test_give_unit_other_race(CuTest * tc) {
    struct give env = { 0 };
    test_setup_ex(tc);
    env.f1 = test_create_faction(test_create_race("elf"));
    env.f2 = test_create_faction(test_create_race("orc"));
    setup_give(&env);
    scale_number(env.dst, 57);
    CuAssertIntEquals(tc, 0, count_maxmigrants(env.f2));
    give_unit(env.src, env.dst, NULL);
    CuAssertIntEquals(tc, 0, env.f2->newbies);
    CuAssertPtrNotNull(tc, test_find_messagetype(env.f1->msgs, "error120"));
    test_teardown();
}
Ejemplo n.º 14
0
struct number *
readnumber(struct source *src, u_int base)
{
	struct number	*n;
	int		ch;
	bool		sign = false;
	bool		dot = false;
	BN_ULONG	v;
	u_int		i;

	n = new_number();
	bn_check(BN_zero(n->number));

	while ((ch = (*src->vtable->readchar)(src)) != EOF) {

		if ('0' <= ch && ch <= '9')
			v = ch - '0';
		else if ('A' <= ch && ch <= 'F')
			v = ch - 'A' + 10;
		else if (ch == '_') {
			sign = true;
			continue;
		} else if (ch == '.') {
			if (dot)
				break;
			dot = true;
			continue;
		} else {
			(*src->vtable->unreadchar)(src);
			break;
		}
		if (dot)
			n->scale++;

		bn_check(BN_mul_word(n->number, base));

#if 0
		/* work around a bug in BN_add_word: 0 += 0 is buggy.... */
		if (v > 0)
#endif
			bn_check(BN_add_word(n->number, v));
	}
	if (base != 10) {
		scale_number(n->number, n->scale);
		for (i = 0; i < n->scale; i++)
			(void)BN_div_word(n->number, base);
	}
	if (sign)
		negate(n);
	return n;
}
Ejemplo n.º 15
0
static void test_give_cmd_limit(CuTest * tc) {
    struct give env = { 0 };
    unit *u;
    test_setup_ex(tc);
    env.f2 = env.f1 = test_create_faction(NULL);
    setup_give(&env);
    u = env.src;
    scale_number(u, 2);
    u->thisorder = create_order(K_GIVE, u->faction->locale, "%s 1 PERSON", itoa36(env.dst->no));
    give_cmd(u, u->thisorder);
    CuAssertIntEquals(tc, 2, env.dst->number);
    CuAssertIntEquals(tc, 1, env.src->number);
    test_teardown();
}
Ejemplo n.º 16
0
static bool hunger(int number, unit * u)
{
    region *r = u->region;
    int dead = 0, hpsub = 0;
    int hp = u->hp / u->number;
    static const char *damage = 0;
    static const char *rcdamage = 0;
    static const race *rc = 0;

    if (!damage) {
        damage = get_param(global.parameters, "hunger.damage");
        if (damage == NULL)
            damage = "1d12+12";
    }
    if (rc != u_race(u)) {
        rcdamage = get_param(u_race(u)->parameters, "hunger.damage");
        rc = u_race(u);
    }

    while (number--) {
        int dam = dice_rand(rcdamage ? rcdamage : damage);
        if (dam >= hp) {
            ++dead;
        }
        else {
            hpsub += dam;
        }
    }

    if (dead) {
        /* Gestorbene aus der Einheit nehmen,
        * Sie bekommen keine Beerdingung. */
        ADDMSG(&u->faction->msgs, msg_message("starvation",
            "unit region dead live", u, r, dead, u->number - dead));

        scale_number(u, u->number - dead);
        deathcounts(r, dead);
    }
    if (hpsub > 0) {
        /* Jetzt die Schäden der nicht gestorbenen abziehen. */
        u->hp -= hpsub;
        /* Meldung nur, wenn noch keine für Tote generiert. */
        if (dead == 0) {
            /* Durch unzureichende Ernährung wird %s geschwächt */
            ADDMSG(&u->faction->msgs, msg_message("malnourish", "unit region", u, r));
        }
    }
    return (dead || hpsub);
}
Ejemplo n.º 17
0
void drown(region * r)
{
    if (fval(r->terrain, SEA_REGION)) {
        unit **up = &r->units;
        while (*up) {
            unit *u = *up;

            if (!(u->ship || u_race(u) == get_race(RC_SPELL) || u->number == 0 || canswim(u) || canfly(u))) {
                scale_number(u, 0);
                ADDMSG(&u->faction->msgs, msg_message("drown", "unit region", u, r));
            }

            up = &u->next;
        }
        remove_empty_units_in_region(r);
    }
}
Ejemplo n.º 18
0
ERRORCODE HALOHelper::init(GRAPHIC_CREATE_STRUCT_PTR gcs)
{
    SHORT i;
    ERRORCODE error;

    /* We need a file to read. */

    StorageDevicePtr pSource;
    ReadOnlyFile file;

    if (gcs == NULL || (pSource = gcs->pSourceDevice) == NULL)
    {
        /* Go directly to disk. */
        file.set_name(graphic->m_csFileName);
        pSource = &file;
    }

    if ((error = read_halo_header(pSource,
                                  (LPWORD)&graphic->record.x_size,
                                  (LPWORD)&graphic->record.y_size,
                                  (LPWORD)&graphic->record.x_resolution,
                                  (LPWORD)&graphic->record.y_resolution)) == ERRORCODE_None)
    {
        graphic->record.storage = GRAPHIC_STORAGE_FILE;

        /* Initialize the start of line variables. */

        for (i = 0; i < 9; i++)
        {
            record.lines[i].line =
                scale_number(graphic->record.y_size, i, 8);
            record.lines[i].offset = 0L;
        }

        record.lines[0].offset = sizeof(HALO_HEADER);

        CHAR buffer[_MAX_PATH];
        strcpy(buffer, graphic->m_csFileName);

        CHAR *extension = strrchr(buffer, '.')+1;
        strcpy(extension, "PAL");
        record.has_pal_file = (access_file(buffer) == 0);
    }

    return error;
}
Ejemplo n.º 19
0
static void test_give_unit_humans(CuTest * tc) {
    struct give env = { 0 };
    race *rc;

    test_setup_ex(tc);
    env.f1 = test_create_faction(test_create_race("elf"));
    env.f2 = test_create_faction(rc = test_create_race("human"));
    rc->flags |= RCF_MIGRANTS;
    setup_give(&env);

    give_unit(env.src, env.dst, NULL);
    CuAssertPtrNotNull(tc, test_find_messagetype(env.f1->msgs, "error128"));
    CuAssertIntEquals(tc, 0, env.f2->newbies);

    scale_number(env.dst, 57);
    CuAssertIntEquals(tc, 1, count_maxmigrants(env.f2));
    give_unit(env.src, env.dst, NULL);
    CuAssertIntEquals(tc, 1, env.f2->newbies);
    test_teardown();
}
Ejemplo n.º 20
0
static void absorbed_by_monster(unit * u)
{
    int n;

    switch (old_race(u_race(u))) {
    default:
        n = rng_int() % (u->number / 20 + 1);
    }

    if (n > 0) {
        n = lovar(n);
        n = _min(rpeasants(u->region), n);
        if (n > 0) {
            rsetpeasants(u->region, rpeasants(u->region) - n);
            scale_number(u, u->number + n);
            ADDMSG(&u->region->msgs, msg_message("absorbpeasants",
                                                 "unit race amount", u, u_race(u), n));
        }
    }
}
Ejemplo n.º 21
0
/**
 ** GM: KILL UNIT <id> <string>
 ** requires: permission-key "gmkill"
 **/
static void gm_killunit(const void *tnext, struct unit *u, struct order *ord)
{
  const struct plane *p = rplane(u->region);
  unit *target = findunit(getid());
  const char *msg = getstrtoken();
  region *r = target->region;

  if (r == NULL || p != rplane(r)) {
    mistake(u, ord, "region is in another plane.");
  } else {
    /* checking permissions */
    attrib *permissions = a_find(u->faction->attribs, &at_permissions);
    if (!permissions || !has_permission(permissions, atoi36("gmkill"))) {
      mistake(u, ord, "permission denied.");
    } else {
      scale_number(target, 0);
      ADDMSG(&target->faction->msgs, msg_message("killedbygm",
          "region unit string", r, target, msg));
    }
  }
}
Ejemplo n.º 22
0
static region *wall_move(const connection * b, struct unit *u,
  struct region *from, struct region *to, bool routing)
{
  wall_data *fd = (wall_data *) b->data.v;
  if (!routing && fd->active) {
    int hp = dice(3, fd->force) * u->number;
    hp = _min(u->hp, hp);
    u->hp -= hp;
    if (u->hp) {
      ADDMSG(&u->faction->msgs, msg_message("firewall_damage",
          "region unit", from, u));
    } else
      ADDMSG(&u->faction->msgs, msg_message("firewall_death", "region unit",
          from, u));
    if (u->number > u->hp) {
      scale_number(u, u->hp);
      u->hp = u->number;
    }
  }
  return to;
}
Ejemplo n.º 23
0
void
printnumber(FILE *f, const struct number *b, u_int base)
{
	struct number	*int_part, *fract_part;
	int		digits;
	char		buf[11];
	size_t		sz;
	int		i;
	struct stack	stack;
	char		*p;

	charcount = 0;
	lastchar = -1;
	if (BN_is_zero(b->number))
		putcharwrap(f, '0');

	int_part = new_number();
	fract_part = new_number();
	fract_part->scale = b->scale;

	if (base <= 16)
		digits = 1;
	else {
		digits = snprintf(buf, sizeof(buf), "%u", base-1);
	}
	split_number(b, int_part->number, fract_part->number);

	i = 0;
	stack_init(&stack);
	while (!BN_is_zero(int_part->number)) {
		BN_ULONG rem = BN_div_word(int_part->number, base);
		stack_pushstring(&stack, get_digit(rem, digits, base));
		i++;
	}
	sz = i;
	if (BN_cmp(b->number, &zero) < 0)
		putcharwrap(f, '-');
	for (i = 0; i < sz; i++) {
		p = stack_popstring(&stack);
		if (base > 16)
			putcharwrap(f, ' ');
		printwrap(f, p);
		free(p);
	}
	stack_clear(&stack);
	if (b->scale > 0) {
		struct number	*num_base;
		BIGNUM		mult, stop;

		putcharwrap(f, '.');
		num_base = new_number();
		BN_set_word(num_base->number, base);
		BN_init(&mult);
		BN_one(&mult);
		BN_init(&stop);
		BN_one(&stop);
		scale_number(&stop, b->scale);

		i = 0;
		while (BN_cmp(&mult, &stop) < 0) {
			u_long	rem;

			if (i && base > 16)
				putcharwrap(f, ' ');
			i = 1;

			bmul_number(fract_part, fract_part, num_base);
			split_number(fract_part, int_part->number, NULL);
			rem = BN_get_word(int_part->number);
			p = get_digit(rem, digits, base);
			int_part->scale = 0;
			normalize(int_part, fract_part->scale);
			BN_sub(fract_part->number, fract_part->number,
			    int_part->number);
			printwrap(f, p);
			free(p);
			BN_mul_word(&mult, base);
		}
		free_number(num_base);
		BN_free(&mult);
		BN_free(&stop);
	}
	flushwrap(f);
	free_number(int_part);
	free_number(fract_part);
}
Ejemplo n.º 24
0
static void
bexp(void)
{
	struct number	*a, *p;
	struct number	*r;
	bool		neg;
	u_int		rscale;

	p = pop_number();
	if (p == NULL)
		return;
	a = pop_number();
	if (a == NULL) {
		push_number(p);
		return;
	}

	if (p->scale != 0) {
		BIGNUM *i, *f;
		i = BN_new();
		bn_checkp(i);
		f = BN_new();
		bn_checkp(f);
		split_number(p, i, f);
		if (!BN_is_zero(f))
			warnx("Runtime warning: non-zero fractional part in exponent");
		BN_free(i);
		BN_free(f);
	}

	normalize(p, 0);

	neg = false;
	if (BN_is_negative(p->number)) {
		neg = true;
		negate(p);
		rscale = bmachine.scale;
	} else {
		/* Posix bc says min(a.scale * b, max(a.scale, scale) */
		u_long b;
		u_int m;

		b = BN_get_word(p->number);
		m = max(a->scale, bmachine.scale);
		rscale = a->scale * (u_int)b;
		if (rscale > m || (a->scale > 0 && (b == ULONG_MAX ||
		    b > UINT_MAX)))
			rscale = m;
	}

	if (BN_is_zero(p->number)) {
		r = new_number();
		bn_check(BN_one(r->number));
		normalize(r, rscale);
	} else {
		u_int ascale, mscale;

		ascale = a->scale;
		while (!BN_is_bit_set(p->number, 0)) {
			ascale *= 2;
			bmul_number(a, a, a, ascale);
			bn_check(BN_rshift1(p->number, p->number));
		}

		r = dup_number(a);
		bn_check(BN_rshift1(p->number, p->number));

		mscale = ascale;
		while (!BN_is_zero(p->number)) {
			ascale *= 2;
			bmul_number(a, a, a, ascale);
			if (BN_is_bit_set(p->number, 0)) {
				mscale += ascale;
				bmul_number(r, r, a, mscale);
			}
			bn_check(BN_rshift1(p->number, p->number));
		}

		if (neg) {
			BN_CTX *ctx;
			BIGNUM *one;

			one = BN_new();
			bn_checkp(one);
			bn_check(BN_one(one));
			ctx = BN_CTX_new();
			bn_checkp(ctx);
			scale_number(one, r->scale + rscale);

			if (BN_is_zero(r->number))
				warnx("divide by zero");
			else
				bn_check(BN_div(r->number, NULL, one,
				    r->number, ctx));
			BN_free(one);
			BN_CTX_free(ctx);
			r->scale = rscale;
		} else
			normalize(r, rscale);
	}
	push_number(r);
	free_number(a);
	free_number(p);
}
Ejemplo n.º 25
0
UpdateStatePtr PatternObject::update(RedisplayContextPtr rc, PBOX_PTR extent, LPRECT clip, UpdateStatePtr ustate, REFRESH_TYPE refresh_type)
{
	PBOX bound;
	RECT r;
	HDC hdc = rc->destination_hdc;

	if (rc->want_update_names())
	{
		rc->update_name(this, NULL);
	}

/* Convert the bound to destination coordinates. */

	bound = get_bound();
	rc->pbox_to_screen(&bound, TRUE);

	if (rc->convert_pbox(&bound, &r, clip))
	{
		HBRUSH hBrush;
		RGBCOLOR color = rgbcolor_from_color(precord.bcolor);
		SHORT red = RED_COMPONENT_OF(color),
				green = GREEN_COMPONENT_OF(color),
				blue = BLUE_COMPONENT_OF(color);

		if (precord.pattern > 100)
		{
		/* Special pattern. */
			hBrush = CreateHatchBrush(precord.pattern == 101
								? HS_VERTICAL				/* Horizontal cut pattern */
								: HS_HORIZONTAL,			/* Vertical cut pattern */
							RGB(red, green, blue));		/* Color */
		}
		else
		{
			SHORT pattern = 100 - precord.pattern;

		/*
		// Handle the pattern:
		//
		// precord.pattern		color
		// ---------------		-----
		//        0					bcolor (default)
		//       100				WHITE
		//     the rest			lerp()
		//
		// It is the INTENSITY of color, in a CMYK sense.
		//
		// (Note that 'pattern' equals 100-precord.pattern at this point.)
		*/

			if (pattern != 100)
			{
				red = 255-scale_number(255-red, pattern, 100);
				green = 255-scale_number(255-green, pattern, 100);
				blue = 255-scale_number(255-blue, pattern, 100);
			}

			hBrush = CreateSolidBrush(RGB(red, green, blue));
		}

		HBRUSH hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);

		rc->toggle(FALSE, &r);
		PatBlt(hdc, r.left, r.top, r.right-r.left, r.bottom-r.top, PATCOPY);
		rc->toggle(TRUE, &r);

		DeleteObject(SelectObject(hdc, hOldBrush));
	}
	return NULL;
}
Ejemplo n.º 26
0
static void
bexp(void)
{
	struct number	*a, *p;
	struct number	*r;
	bool		neg;
	u_int		scale;

	p = pop_number();
	if (p == NULL) {
		return;
	}
	a = pop_number();
	if (a == NULL) {
		push_number(p);
		return;
	}

	if (p->scale != 0)
		warnx("Runtime warning: non-zero scale in exponent");
	normalize(p, 0);

	neg = false;
	if (BN_cmp(p->number, &zero) < 0) {
		neg = true;
		negate(p);
		scale = bmachine.scale;
	} else {
		/* Posix bc says min(a.scale * b, max(a.scale, scale) */
		u_long	b;
		u_int	m;

		b = BN_get_word(p->number);
		m = max(a->scale, bmachine.scale);
		scale = a->scale * (u_int)b;
		if (scale > m || (a->scale > 0 && (b == BN_MASK2 ||
		    b > UINT_MAX)))
			scale = m;
	}

	if (BN_is_zero(p->number)) {
		r = new_number();
		bn_check(BN_one(r->number));
		normalize(r, scale);
	} else {
		while (!BN_is_bit_set(p->number, 0)) {
			bmul_number(a, a, a);
			bn_check(BN_rshift1(p->number, p->number));
		}

		r = dup_number(a);
		normalize(r, scale);
		bn_check(BN_rshift1(p->number, p->number));

		while (!BN_is_zero(p->number)) {
			bmul_number(a, a, a);
			if (BN_is_bit_set(p->number, 0))
				bmul_number(r, r, a);
			bn_check(BN_rshift1(p->number, p->number));
		}

		if (neg) {
			BN_CTX	*ctx;
			BIGNUM	*one;

			one = BN_new();
			bn_checkp(one);
			bn_check(BN_one(one));
			ctx = BN_CTX_new();
			bn_checkp(ctx);
			scale_number(one, r->scale + scale);
			normalize(r, scale);
			bn_check(BN_div(r->number, NULL, one, r->number, ctx));
			BN_free(one);
			BN_CTX_free(ctx);
		} else
			normalize(r, scale);
	}
	push_number(r);
	free_number(a);
	free_number(p);
}
Ejemplo n.º 27
0
/* In a->data.ca[1] steht der Prozentsatz mit dem sich die Einheit
 * auflöst, in a->data.ca[0] kann angegeben werden, wohin die Personen
 * verschwinden. Passiert bereits in der ersten Runde! */
static void dissolve_units(void)
{
  region *r;
  unit *u;
  int n;
  int i;

  for (r = regions; r; r = r->next) {
    for (u = r->units; u; u = u->next) {
      attrib *a = a_find(u->attribs, &at_unitdissolve);
      if (a) {
        message *msg;

        if (u->age == 0 && a->data.ca[1] < 100)
          continue;

        /* TODO: Durch einzelne Berechnung ersetzen */
        if (a->data.ca[1] == 100) {
          n = u->number;
        } else {
          n = 0;
          for (i = 0; i < u->number; i++) {
            if (rng_int() % 100 < a->data.ca[1])
              n++;
          }
        }

        /* wenn keiner verschwindet, auch keine Meldung */
        if (n == 0) {
          continue;
        }

        scale_number(u, u->number - n);

        switch (a->data.ca[0]) {
          case 1:
            rsetpeasants(r, rpeasants(r) + n);
            msg =
              msg_message("dissolve_units_1", "unit region number race", u, r,
              n, u_race(u));
            break;
          case 2:
            if (r->land && !fval(r, RF_MALLORN)) {
              rsettrees(r, 2, rtrees(r, 2) + n);
              msg =
                msg_message("dissolve_units_2", "unit region number race", u, r,
                n, u_race(u));
            } else {
              msg =
                msg_message("dissolve_units_3", "unit region number race", u, r,
                n, u_race(u));
            }
            break;
          default:
              if (u_race(u) == get_race(RC_STONEGOLEM)
                  || u_race(u) == get_race(RC_IRONGOLEM)) {
              msg =
                msg_message("dissolve_units_4", "unit region number race", u, r,
                n, u_race(u));
            } else {
              msg =
                msg_message("dissolve_units_5", "unit region number race", u, r,
                n, u_race(u));
            }
            break;
        }

        add_message(&u->faction->msgs, msg);
        msg_release(msg);
      }
    }
  }

  remove_empty_units();
}
Ejemplo n.º 28
0
void transfermen(unit * u, unit * u2, int n)
{
  const attrib *a;
  int hp = u->hp;
  region *r = u->region;

  if (n == 0)
    return;
  assert(n > 0);
  /* "hat attackiert"-status wird übergeben */

  if (u2) {
    skill *sv, *sn;
    skill_t sk;
    ship *sh;

    assert(u2->number + n > 0);

    for (sk = 0; sk != MAXSKILLS; ++sk) {
      int weeks, level = 0;

      sv = get_skill(u, sk);
      sn = get_skill(u2, sk);

      if (sv == NULL && sn == NULL)
        continue;
      if (sn == NULL && u2->number == 0) {
        /* new unit, easy to solve */
        level = sv->level;
        weeks = sv->weeks;
      } else {
        double dlevel = 0.0;

        if (sv && sv->level) {
          dlevel += (sv->level + 1 - sv->weeks / (sv->level + 1.0)) * n;
          level += sv->level * n;
        }
        if (sn && sn->level) {
          dlevel +=
            (sn->level + 1 - sn->weeks / (sn->level + 1.0)) * u2->number;
          level += sn->level * u2->number;
        }

        dlevel = dlevel / (n + u2->number);
        level = level / (n + u2->number);
        if (level <= dlevel) {
          /* apply the remaining fraction to the number of weeks to go.
           * subtract the according number of weeks, getting closer to the
           * next level */
          level = (int)dlevel;
          weeks = (level + 1) - (int)((dlevel - level) * (level + 1));
        } else {
          /* make it harder to reach the next level. 
           * weeks+level is the max difficulty, 1 - the fraction between
           * level and dlevel applied to the number of weeks between this
           * and the previous level is the added difficutly */
          level = (int)dlevel + 1;
          weeks = 1 + 2 * level - (int)((1 + dlevel - level) * level);
        }
      }
      if (level) {
        if (sn == NULL)
          sn = add_skill(u2, sk);
        sn->level = (unsigned char)level;
        sn->weeks = (unsigned char)weeks;
        assert(sn->weeks > 0 && sn->weeks <= sn->level * 2 + 1);
        assert(u2->number != 0 || (sn->level == sv->level
            && sn->weeks == sv->weeks));
      } else if (sn) {
        remove_skill(u2, sk);
        sn = NULL;
      }
    }
    a = a_find(u->attribs, &at_effect);
    while (a && a->type == &at_effect) {
      effect_data *olde = (effect_data *) a->data.v;
      if (olde->value)
        change_effect(u2, olde->type, olde->value);
      a = a->next;
    }
    sh = leftship(u);
    if (sh != NULL)
      set_leftship(u2, sh);
    u2->flags |=
      u->flags & (UFL_LONGACTION | UFL_NOTMOVING | UFL_HUNGER | UFL_MOVED |
      UFL_ENTER);
    if (u->attribs) {
      transfer_curse(u, u2, n);
    }
  }
  scale_number(u, u->number - n);
  if (u2) {
    set_number(u2, u2->number + n);
    hp -= u->hp;
    u2->hp += hp;
    /* TODO: Das ist schnarchlahm! und gehört nicht hierhin */
    a = a_find(u2->attribs, &at_effect);
    while (a && a->type == &at_effect) {
      attrib *an = a->next;
      effect_data *olde = (effect_data *) a->data.v;
      int e = get_effect(u, olde->type);
      if (e != 0)
        change_effect(u2, olde->type, -e);
      a = an;
    }
  } else if (r->land) {
    if ((u_race(u)->ec_flags & ECF_REC_ETHEREAL) == 0) {
      const race *rc = u_race(u);
      if (rc->ec_flags & ECF_REC_HORSES) {      /* Zentauren an die Pferde */
        int h = rhorses(r) + n;
        rsethorses(r, h);
      } else {
        int p = rpeasants(r);
        p += (int)(n * rc->recruit_multi);
        rsetpeasants(r, p);
      }
    }
  }
}
Ejemplo n.º 29
0
void convert_file(const char *pName,
						const char *pDestName,
						int nNewAmplitude,
						int nPercent,
						DWORD __huge *pdwHistogram,
						int nNewBits)
{

	printf("Converting '%s' to '%s'...", pName, pDestName);

/* Open the file. */

	FILE *sfile;

	if ((sfile = fopen(pName, "rb")) == NULL)
	{
		printf("\nERROR: Unable to open file '%s' for reading.\n", pName);
		return;
	}

/* Read the file header from the source file. */

	if (fread(&file_header, 1, sizeof(file_header), sfile) != sizeof(file_header))
	{
		fclose(sfile);
		printf("\nERROR: Unable to read wave file header from file '%s'.\n", pName);
		return;
	}

	if (file_header.format.nBitsPerSample != 16)
	{
		fclose(sfile);
		printf("\nERROR: This is not a 16-bit wave file we can operate on\n");
		return;
	}

/* Modify the header to have the new N-bit values. */

	file_header.format.wf.nBlockAlign = nNewBits/8;
	file_header.format.wf.nAvgBytesPerSec =
					file_header.format.wf.nSamplesPerSec *
					file_header.format.wf.nBlockAlign;
	file_header.format.nBitsPerSample = nNewBits;

	DWORD dwOldSize = file_header.data_chunk.dwSize;
	DWORD dwNewSize = dwOldSize/(16/nNewBits);

	file_header.header.dwSize += (dwNewSize - dwOldSize);
	file_header.data_chunk.dwSize = dwNewSize;

	FILE * dfile;
	if ((dfile = fopen(pDestName, "w+b")) == NULL)
	{
		fclose(sfile);
		printf("\nERROR: Unable to create file '%s' for writing.\n", pDestName);
		return;
	}

/*
// Compute how many samples are in the old file.
*/

	DWORD dwOldCount = dwOldSize/2;

/*
// Write the header to the file.
*/

	if (fwrite(&file_header, 1, sizeof(file_header), dfile) != sizeof(file_header))
	{
		fclose(sfile);
		fclose(dfile);
		printf("\nERROR: Unable to write wave file header to file '%s'.\n", pDestName);
		return;
	}

/*
// Read and copy all the data.
*/

	int nOldAverage;
	int nOldAmplitude = -1;
	int nClipAmp;

/*
// Prepare for amplitude conversion if requested.
*/

	if (nNewAmplitude != -1 && pdwHistogram != NULL)
	{
	/*
	// Generate the max amplitude and histogram.
	*/

		nOldAmplitude = compute_old_amplitude(sfile, dwOldCount, nOldAverage, pdwHistogram);

		if (nOldAmplitude == -1)
		{
			fclose(sfile);
			fclose(dfile);
			printf("\nERROR: Error reading source data to compute histogram.\n\n");
			return;
		}

	/*
	// To compute the amplitude, we count samples until we reach the desired
	// percentage. The amplitude at that point is the one we use.
	*/

		DWORD dwCount = 0;
		DWORD dwIncCount = dwOldCount*nPercent/100L;
		unsigned int uMaxAmp;

		for (uMaxAmp = 0; uMaxAmp < 32767; uMaxAmp++)
		{
			dwCount += pdwHistogram[uMaxAmp];
			if (dwCount >= dwIncCount)
			{
				break;
			}
		}

		printf("\nConvert amp (%d) from %u to %d)", nOldAmplitude, uMaxAmp, nNewAmplitude);

		nOldAmplitude = uMaxAmp;
	}

	if (nNewAmplitude > nOldAmplitude)
	{
		nClipAmp = scale_number(32766, nOldAmplitude, nNewAmplitude);
	}
	else
	{
		nClipAmp = 32766;
	}

	for (DWORD dwIndex = 0; dwIndex < dwOldCount; dwIndex++)
	{
		int nOldData;

		if (fread(&nOldData, 1, sizeof(nOldData), sfile) != sizeof(nOldData))
		{
			printf("Error reading source data during conversion.\n\n");
			fclose(sfile);
			fclose(dfile);
		}

#if 0
		int nUseData = (nOldData < 0) ? -nOldData : nOldData;

		int nDiff;

		if (nUseData < nMinAmp)
		{
			nDiff = 0;
		}
		else
		{
			nDiff = nNewAmplitude - nUseData;

			int nMaxDiff = nUseData;
			int nUseDiff = (nDiff < 0) ? -nDiff : nDiff;

			if (nUseDiff > nMaxDiff)
			{
				nUseDiff = nMaxDiff;
				nDiff = (nDiff < 0) ? -nUseDiff : nUseDiff;
			}
		}

		if (nOldData < 0)
		{
			nDiff = -nDiff;
		}

		int nNewData = nOldData + nDiff/10;

#else
		int nNewData = nOldData;

		if (nNewAmplitude != -1 && nOldAmplitude > 0)
		{
			int nTestData = (nOldData < 0) ? -nOldData : nOldData;
			if (nTestData > nClipAmp)
			{
				nOldData = (nOldData < 0) ? -nClipAmp : nClipAmp;
			}
			nNewData = scale_number(nOldData, nNewAmplitude, nOldAmplitude);
		}
#endif

		if (nNewBits == 16)
		{
		/* Write it back out. */
			fwrite(&nNewData, 1, sizeof(nNewData), dfile);
		}
		else
		{
		/* Must be 8-bit. */

			if (nNewData < 0)
			{
				nNewData = -(-nNewData & 0xFF00);
			}
			char cNewData = ((char)(nNewData >> 8)) + 128;

			fwrite(&cNewData, 1, sizeof(cNewData), dfile);
		}
	}

	fclose(sfile);
	fclose(dfile);
	printf("\nConverted successfully\n");
}
Ejemplo n.º 30
0
static int
damage_unit(unit * u, const char *dam, bool physical, bool magic)
{
  int *hp = malloc(u->number * sizeof(int));
  int h;
  int i, dead = 0, hp_rem = 0, heiltrank;
  double magres = magic_resistance(u);

  assert(u->number);
  if (fval(u_race(u), RCF_ILLUSIONARY) || u_race(u) == get_race(RC_SPELL)) {
    return 0;
  }

  h = u->hp / u->number;
  /* HP verteilen */
  for (i = 0; i < u->number; i++)
    hp[i] = h;
  h = u->hp - (u->number * h);
  for (i = 0; i < h; i++)
    hp[i]++;

  /* Schaden */
  for (i = 0; i < u->number; i++) {
    int damage = dice_rand(dam);
    if (magic)
      damage = (int)(damage * (1.0 - magres));
    if (physical)
      damage -= nb_armor(u, i);
    hp[i] -= damage;
  }

  /* Auswirkungen */
  for (i = 0; i < u->number; i++) {
    if (hp[i] <= 0) {
      heiltrank = 0;

      /* Sieben Leben */
      if (old_race(u_race(u)) == RC_CAT && (chance(1.0 / 7))) {
        hp[i] = u->hp / u->number;
        hp_rem += hp[i];
        continue;
      }

      /* Heiltrank */
      if (oldpotiontype[P_HEAL]) {
        if (get_effect(u, oldpotiontype[P_HEAL]) > 0) {
          change_effect(u, oldpotiontype[P_HEAL], -1);
          heiltrank = 1;
        } else if (i_get(u->items, oldpotiontype[P_HEAL]->itype) > 0) {
          i_change(&u->items, oldpotiontype[P_HEAL]->itype, -1);
          change_effect(u, oldpotiontype[P_HEAL], 3);
          heiltrank = 1;
        }
        if (heiltrank && (chance(0.50))) {
          hp[i] = u->hp / u->number;
          hp_rem += hp[i];
          continue;
        }
      }
      dead++;
    } else {
      hp_rem += hp[i];
    }
  }

  scale_number(u, u->number - dead);
  u->hp = hp_rem;

  free(hp);

  return dead;
}