mirror of
https://github.com/brmlab/brmlife.git
synced 2025-08-02 18:03:37 +02:00
Incomp. Proto. Change: attack_dir gets <force> parameter
This commit is contained in:
parent
177d41cf60
commit
091708f577
6 changed files with 22 additions and 16 deletions
10
README
10
README
|
@ -57,10 +57,11 @@ The following outputs are supported:
|
||||||
|
|
||||||
move_dir <x> <y>
|
move_dir <x> <y>
|
||||||
<x> and <y> are integer offsets relative
|
<x> and <y> are integer offsets relative
|
||||||
to the current position; may be just {-1,0,1}
|
to the current position, may be just {-1,0,1}
|
||||||
attack_dir <x> <y>
|
attack_dir <x> <y> <force>
|
||||||
<x> and <y> are integer offsets relative
|
<x> and <y> are integer offsets relative
|
||||||
to the current position; may be just {-1,0,1}
|
to the current position, may be just {-1,0,1};
|
||||||
|
<force> is invested energy, damage is proportional
|
||||||
breed_dir <x> <y> <info>
|
breed_dir <x> <y> <info>
|
||||||
<info> is arbitrary string passed to the "mother"
|
<info> is arbitrary string passed to the "mother"
|
||||||
(to be passed to the child)
|
(to be passed to the child)
|
||||||
|
@ -105,3 +106,6 @@ If the id corresponds to a disconnected agent, the connection
|
||||||
is immediately attached to that agent. Combining this with other
|
is immediately attached to that agent. Combining this with other
|
||||||
negotiation commands is undefined, except for newborns - in that case,
|
negotiation commands is undefined, except for newborns - in that case,
|
||||||
negotiation commands must follow after agent_id.
|
negotiation commands must follow after agent_id.
|
||||||
|
|
||||||
|
TODO proto. change:
|
||||||
|
tickid for input
|
||||||
|
|
13
agent.cc
13
agent.cc
|
@ -66,7 +66,7 @@ agent::move_dir(int dir_x, int dir_y)
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
agent::attack_dir(int dir_x, int dir_y)
|
agent::attack_dir(int dir_x, int dir_y, int force)
|
||||||
{
|
{
|
||||||
if (dead || !tile)
|
if (dead || !tile)
|
||||||
return false;
|
return false;
|
||||||
|
@ -76,8 +76,8 @@ agent::attack_dir(int dir_x, int dir_y)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
class agent *a = t2->agent;
|
class agent *a = t2->agent;
|
||||||
chenergy(world::attack_cost);
|
chenergy(-force);
|
||||||
a->chenergy(world::defense_cost);
|
a->chenergy(-force * world::defense_const_factor);
|
||||||
if (dead || a->dead)
|
if (dead || a->dead)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
@ -86,9 +86,10 @@ agent::attack_dir(int dir_x, int dir_y)
|
||||||
int attack_roll = random() % attack_dice;
|
int attack_roll = random() % attack_dice;
|
||||||
int defense_dice = round(a->attr.defense * a->energy);
|
int defense_dice = round(a->attr.defense * a->energy);
|
||||||
int defense_roll = random() % defense_dice;
|
int defense_roll = random() % defense_dice;
|
||||||
if (attack_roll > defense_roll)
|
if (attack_roll > defense_roll) {
|
||||||
a->chenergy(defense_roll - attack_roll);
|
a->chenergy(-force);
|
||||||
return attack_roll >= defense_roll;
|
}
|
||||||
|
return attack_roll > defense_roll;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|
2
agent.h
2
agent.h
|
@ -58,7 +58,7 @@ public:
|
||||||
void spawn_at(class tile &tile);
|
void spawn_at(class tile &tile);
|
||||||
|
|
||||||
bool move_dir(int dir_x, int dir_y);
|
bool move_dir(int dir_x, int dir_y);
|
||||||
bool attack_dir(int dir_x, int dir_y);
|
bool attack_dir(int dir_x, int dir_y, int force);
|
||||||
bool breed_dir(int dir_x, int dir_y, std::string info);
|
bool breed_dir(int dir_x, int dir_y, std::string info);
|
||||||
bool secrete(int id, double intensity);
|
bool secrete(int id, double intensity);
|
||||||
|
|
||||||
|
|
|
@ -116,7 +116,7 @@ sub take_action($$) {
|
||||||
print "moves ".join(", ", @move)." => (".dirindex($max).":$max->[0],$max->[1])\n";
|
print "moves ".join(", ", @move)." => (".dirindex($max).":$max->[0],$max->[1])\n";
|
||||||
|
|
||||||
if ($attack[dirindex($max)]) {
|
if ($attack[dirindex($max)]) {
|
||||||
print $socket "attack_dir $max->[0] $max->[1]\r\n";
|
print $socket "attack_dir $max->[0] $max->[1] 100\r\n";
|
||||||
} else {
|
} else {
|
||||||
print $socket "move_dir $max->[0] $max->[1]\r\n";
|
print $socket "move_dir $max->[0] $max->[1]\r\n";
|
||||||
}
|
}
|
||||||
|
|
|
@ -168,11 +168,12 @@ bump_negot:
|
||||||
bump();
|
bump();
|
||||||
mask |= 1;
|
mask |= 1;
|
||||||
} else if (!negotiation && !cmd.compare("attack_dir") && !(mask & 2)) {
|
} else if (!negotiation && !cmd.compare("attack_dir") && !(mask & 2)) {
|
||||||
int x = 0, y = 0;
|
int x = 0, y = 0, force = 0;
|
||||||
sscanf(line.c_str(), "%d %d", &x, &y);
|
sscanf(line.c_str(), "%d %d %d", &x, &y, &force);
|
||||||
if (x < -1) x = -1; if (x > 1) x = 1;
|
if (x < -1) x = -1; if (x > 1) x = 1;
|
||||||
if (y < -1) y = -1; if (y > 1) y = 1;
|
if (y < -1) y = -1; if (y > 1) y = 1;
|
||||||
if (!agent->attack_dir(x, y))
|
if (force < 1) force = 1;
|
||||||
|
if (!agent->attack_dir(x, y, force))
|
||||||
bump();
|
bump();
|
||||||
mask |= 2;
|
mask |= 2;
|
||||||
} else if (!negotiation && !cmd.compare("breed_dir") && !(mask & 4)) {
|
} else if (!negotiation && !cmd.compare("breed_dir") && !(mask & 4)) {
|
||||||
|
|
4
world.h
4
world.h
|
@ -7,8 +7,6 @@ struct world {
|
||||||
const static int max_energy = 20000;
|
const static int max_energy = 20000;
|
||||||
|
|
||||||
const static int move_cost = -50;
|
const static int move_cost = -50;
|
||||||
const static int attack_cost = -400;
|
|
||||||
const static int defense_cost = -200;
|
|
||||||
const static int breed_out_cost = -newborn_energy/4;
|
const static int breed_out_cost = -newborn_energy/4;
|
||||||
const static int breed_in_cost = -newborn_energy*3/4;
|
const static int breed_in_cost = -newborn_energy*3/4;
|
||||||
const static int pheromone_cost = -10;
|
const static int pheromone_cost = -10;
|
||||||
|
@ -19,6 +17,8 @@ struct world {
|
||||||
const static int sun_energy = 10;
|
const static int sun_energy = 10;
|
||||||
const static int soil_energy = 20; /* ... times five for lone herbs, times one for dense forests */
|
const static int soil_energy = 20; /* ... times five for lone herbs, times one for dense forests */
|
||||||
|
|
||||||
|
const static double defense_const_factor = 0.2;
|
||||||
|
|
||||||
const static int dead_body_energy = 2000;
|
const static int dead_body_energy = 2000;
|
||||||
const static double dead_body_energy_carryover = 0.5;
|
const static double dead_body_energy_carryover = 0.5;
|
||||||
const static int dead_decay = -50;
|
const static int dead_decay = -50;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue