本文整理汇总了C++中dice函数的典型用法代码示例。如果您正苦于以下问题:C++ dice函数的具体用法?C++ dice怎么用?C++ dice使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了dice函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: if
technique_id player::pick_defensive_technique(game *g, monster *z, player *p)
{
if (blocks_left == 0)
return TEC_NULL;
int foe_melee_skill = 0;
if (z != NULL)
foe_melee_skill = z->type->melee_skill;
else if (p != NULL)
foe_melee_skill = p->dex_cur + p->skillLevel("melee");
int foe_dodge = 0;
if (z != NULL)
foe_dodge = z->dodge_roll();
else if (p != NULL)
foe_dodge = p->dodge_roll(g);
int foe_size = 0;
if (z)
foe_size = 4 + z->type->size * 4;
else if (p) {
foe_size = 12;
if (p->str_max <= 5)
foe_size -= 3;
if (p->str_max >= 12)
foe_size += 3;
}
blocks_left--;
if (weapon.has_technique(TEC_WBLOCK_3) &&
dice(dex_cur + skillLevel("melee"), 12) > dice(foe_melee_skill, 10))
return TEC_WBLOCK_3;
if (weapon.has_technique(TEC_WBLOCK_2) &&
dice(dex_cur + skillLevel("melee"), 6) > dice(foe_melee_skill, 10))
return TEC_WBLOCK_2;
if (weapon.has_technique(TEC_WBLOCK_1) &&
dice(dex_cur + skillLevel("melee"), 3) > dice(foe_melee_skill, 10))
return TEC_WBLOCK_1;
if (weapon.has_technique(TEC_DEF_DISARM, this) &&
z == NULL && p->weapon.typeId() != "null" &&
!p->weapon.has_flag(IF_UNARMED_WEAPON) &&
dice( dex_cur + skillLevel("unarmed"), 8) >
dice(p->dex_cur + p->skillLevel("melee"), 10))
return TEC_DEF_DISARM;
if (weapon.has_technique(TEC_DEF_THROW, this) &&
str_cur + skillLevel("melee") >= foe_size + rng(-4, 4) &&
hit_roll() > rng(1, 5) + foe_dodge && !one_in(3))
return TEC_DEF_THROW;
if (weapon.has_technique(TEC_COUNTER, this) &&
hit_roll() > rng(1, 10) + foe_dodge && !one_in(3))
return TEC_COUNTER;
if (weapon.has_technique(TEC_BLOCK_LEGS, this) &&
(hp_cur[hp_leg_l] >= 20 || hp_cur[hp_leg_r] >= 20) &&
dice(dex_cur + skillLevel("unarmed") + skillLevel("melee"), 13) >
dice(8 + foe_melee_skill, 10))
return TEC_BLOCK_LEGS;
if (weapon.has_technique(TEC_BLOCK, this) &&
(hp_cur[hp_arm_l] >= 20 || hp_cur[hp_arm_r] >= 20) &&
dice(dex_cur + skillLevel("unarmed") + skillLevel("melee"), 16) >
dice(6 + foe_melee_skill, 10))
return TEC_BLOCK;
blocks_left++; // We didn't use any blocks, so give it back!
return TEC_NULL;
}
开发者ID:StoicDwarf,项目名称:Cataclysm-DDA,代码行数:72,代码来源:melee.cpp
示例2: mod_moves
void monster::melee_attack(Creature &target, bool) {
mod_moves(-100);
if (type->melee_dice == 0) { // We don't attack, so just return
return;
}
add_effect("hit_by_player", 3); // Make us a valid target for a few turns
if (has_flag(MF_HIT_AND_RUN)) {
add_effect("run", 4);
}
bool u_see_me = g->u_see(this);
body_part bp_hit;
//int highest_hit = 0;
int hitstat = std::max(type->melee_skill - 2,0);
int hitroll = dice(hitstat,10);
damage_instance damage;
if(!is_hallucination()) {
if (type->melee_dice > 0) {
damage.add_damage(DT_BASH,
dice(type->melee_dice,type->melee_sides));
}
if (type->melee_cut > 0) {
damage.add_damage(DT_CUT, type->melee_cut);
}
}
/* TODO: height-related bodypart selection
//If the player is knocked down or the monster can fly, any body part is a valid target
if(target.is_on_ground() || has_flag(MF_FLIES)){
highest_hit = 20;
}
else {
switch (type->size) {
case MS_TINY:
highest_hit = 3;
break;
case MS_SMALL:
highest_hit = 12;
break;
case MS_MEDIUM:
highest_hit = 20;
break;
case MS_LARGE:
highest_hit = 28;
break;
case MS_HUGE:
highest_hit = 35;
break;
}
if (digging()){
highest_hit -= 8;
}
if (highest_hit <= 1){
highest_hit = 2;
}
}
if (highest_hit > 20){
highest_hit = 20;
}
int bp_rand = rng(0, highest_hit - 1);
if (bp_rand <= 2){
bp_hit = bp_legs;
} else if (bp_rand <= 10){
bp_hit = bp_torso;
} else if (bp_rand <= 14){
bp_hit = bp_arms;
} else if (bp_rand <= 16){
bp_hit = bp_mouth;
} else if (bp_rand == 18){
bp_hit = bp_eyes;
} else{
bp_hit = bp_head;
}
*/
dealt_damage_instance dealt_dam;
int hitspread = target.deal_melee_attack(this, hitroll, false, damage, dealt_dam);
bp_hit = dealt_dam.bp_hit;
//Hallucinations always produce messages but never actually deal damage
if (is_hallucination() || dealt_dam.total_damage() > 0) {
if (target.is_player()) {
if (u_see_me) {
g->add_msg(_("The %1$s hits your %2$s."), name().c_str(),
body_part_name(bp_hit, random_side(bp_hit)).c_str());
} else {
g->add_msg(_("Something hits your %s."),
body_part_name(bp_hit, random_side(bp_hit)).c_str());
}
} else {
if (u_see_me) {
g->add_msg(_("The %1$s hits %2$s's %3$s."), name().c_str(),
target.disp_name().c_str(),
body_part_name(bp_hit, random_side(bp_hit)).c_str());
}
//.........这里部分代码省略.........
开发者ID:JedrekD,项目名称:Cataclysm-DDA,代码行数:101,代码来源:monster.cpp
示例3: weather_data
void sounds::process_sound_markers( player *p )
{
bool is_deaf = p->is_deaf();
const float volume_multiplier = p->hearing_ability();
const int weather_vol = weather_data( g->weather ).sound_attn;
for( const auto &sound_event_pair : sounds_since_last_turn ) {
const int volume = sound_event_pair.second.volume * volume_multiplier;
const std::string& sfx_id = sound_event_pair.second.id;
const std::string& sfx_variant = sound_event_pair.second.variant;
const int max_volume = std::max( volume, sound_event_pair.second.volume ); // For deafness checks
int dist = rl_dist( p->pos(), sound_event_pair.first );
bool ambient = sound_event_pair.second.ambient;
// Too far away, we didn't hear it!
if( dist > volume ) {
continue;
}
if( is_deaf ) {
// Has to be here as well to work for stacking deafness (loud noises prolong deafness)
if( !p->is_immune_effect( effect_deaf )
&& rng( ( max_volume - dist ) / 2, ( max_volume - dist ) ) >= 150 ) {
// Prolong deafness, but not as much as if it was freshly applied
int duration = std::min( 40, ( max_volume - dist - 130 ) / 8 );
p->add_effect( effect_deaf, duration );
if( !p->has_trait( "DEADENED" ) ) {
p->add_msg_if_player( m_bad, _( "Your eardrums suddenly ache!" ) );
if( p->pain < 10 ) {
p->mod_pain( rng( 0, 2 ) );
}
}
}
// We're deaf, skip rest of processing.
continue;
}
// Player volume meter includes all sounds from their tile and adjacent tiles
// TODO: Add noises from vehicle player is in.
if( dist <= 1 ) {
p->volume = std::max( p->volume, volume );
}
// Check for deafness
if( !p->is_immune_effect( effect_deaf ) && rng((max_volume - dist) / 2, (max_volume - dist)) >= 150 ) {
int duration = (max_volume - dist - 130) / 4;
p->add_effect( effect_deaf, duration );
if( p->is_deaf() ) {
// Need to check for actual deafness
is_deaf = true;
sfx::do_hearing_loss( duration );
continue;
}
}
// At this point we are dealing with attention (as opposed to physical effects)
// so reduce volume by the amount of ambient noise from the weather.
const int mod_vol = ( sound_event_pair.second.volume - weather_vol ) * volume_multiplier;
// The noise was drowned out by the surroundings.
if( mod_vol - dist < 0 ) {
continue;
}
// See if we need to wake someone up
if( p->has_effect( effect_sleep ) ) {
if( ( !( p->has_trait( "HEAVYSLEEPER" ) ||
p->has_trait( "HEAVYSLEEPER2" ) ) && dice( 2, 15 ) < mod_vol - dist ) ||
( p->has_trait( "HEAVYSLEEPER" ) && dice( 3, 15 ) < mod_vol - dist ) ||
( p->has_trait( "HEAVYSLEEPER2" ) && dice( 6, 15 ) < mod_vol - dist ) ) {
//Not kidding about sleep-thru-firefight
p->wake_up();
add_msg( m_warning, _( "Something is making noise." ) );
} else {
continue;
}
}
const tripoint &pos = sound_event_pair.first;
const std::string &description = sound_event_pair.second.description;
if( !ambient && ( pos != p->pos() ) && !g->m.pl_sees( pos, dist ) ) {
if( p->activity.ignore_trivial != true ) {
std::string query;
if( description.empty() ) {
query = _( "Heard a noise!" );
} else {
query = string_format( _( "Heard %s!" ),
sound_event_pair.second.description.c_str() );
}
if( g->cancel_activity_or_ignore_query( query.c_str() ) ) {
p->activity.ignore_trivial = true;
for( auto activity : p->backlog ) {
activity.ignore_trivial = true;
}
}
}
}
// Only print a description if it exists
if( !description.empty() ) {
// If it came from us, don't print a direction
if( pos == p->pos() ) {
std::string uppercased = description;
capitalize_letter( uppercased, 0 );
add_msg( "%s", uppercased.c_str() );
} else {
// Else print a direction as well
std::string direction = direction_name( direction_from( p->pos(), pos ) );
add_msg( m_warning, _( "From the %s you hear %s" ), direction.c_str(), description.c_str() );
}
//.........这里部分代码省略.........
开发者ID:OwnageIsMagic,项目名称:Cataclysm-DDA,代码行数:101,代码来源:sounds.cpp
示例4: int
//.........这里部分代码省略.........
case fd_gas_vent:
for (int i = x - 1; i <= x + 1; i++) {
for (int j = y - 1; j <= y + 1; j++) {
if (field_at(i, j).type == fd_toxic_gas && field_at(i, j).density < 3)
field_at(i, j).density++;
else
add_field(g, i, j, fd_toxic_gas, 3);
}
}
break;
case fd_fire_vent:
if (cur->density > 1) {
if (one_in(3))
cur->density--;
} else {
cur->type = fd_flame_burst;
cur->density = 3;
}
break;
case fd_flame_burst:
if (cur->density > 1)
cur->density--;
else {
cur->type = fd_fire_vent;
cur->density = 3;
}
break;
case fd_electricity:
if (!one_in(5)) { // 4 in 5 chance to spread
std::vector<point> valid;
if (move_cost(x, y) == 0 && cur->density > 1) { // We're grounded
int tries = 0;
while (tries < 10 && cur->age < 50) {
int cx = x + rng(-1, 1), cy = y + rng(-1, 1);
if (move_cost(cx, cy) != 0 && field_at(cx, cy).is_null()) {
add_field(g, cx, cy, fd_electricity, 1);
cur->density--;
tries = 0;
} else
tries++;
}
} else { // We're not grounded; attempt to ground
for (int a = -1; a <= 1; a++) {
for (int b = -1; b <= 1; b++) {
if (move_cost(x + a, y + b) == 0 && // Grounded tiles first
field_at(x + a, y + b).is_null())
valid.push_back(point(x + a, y + b));
}
}
if (valid.size() == 0) { // Spread to adjacent space, then
int px = x + rng(-1, 1), py = y + rng(-1, 1);
if (move_cost(px, py) > 0 && field_at(px, py).type == fd_electricity &&
field_at(px, py).density < 3)
field_at(px, py).density++;
else if (move_cost(px, py) > 0)
add_field(g, px, py, fd_electricity, 1);
cur->density--;
}
while (valid.size() > 0 && cur->density > 0) {
int index = rng(0, valid.size() - 1);
add_field(g, valid[index].x, valid[index].y, fd_electricity, 1);
cur->density--;
valid.erase(valid.begin() + index);
}
}
}
break;
case fd_fatigue:
if (cur->density < 3 && int(g->turn) % 3600 == 0 && one_in(10))
cur->density++;
else if (cur->density == 3 && one_in(600)) { // Spawn nether creature!
mon_id type = mon_id(rng(mon_flying_polyp, mon_blank));
monster creature(g->mtypes[type]);
creature.spawn(x + rng(-3, 3), y + rng(-3, 3));
g->z.push_back(creature);
}
break;
}
cur->age++;
if (fieldlist[cur->type].halflife > 0) {
if (cur->age > 0 &&
dice(3, cur->age) > dice(3, fieldlist[cur->type].halflife)) {
cur->age = 0;
cur->density--;
}
if (cur->density <= 0) { // Totally dissapated.
grid[gridn].field_count--;
grid[gridn].fld[locx][locy] = field();
}
}
}
}
return found_field;
}
开发者ID:s20dan,项目名称:Cataclysm,代码行数:101,代码来源:field.cpp
示例5: calc_movecost
int monster::move_to(game *g, int x, int y, bool force)
{
// Make sure that we can move there, unless force is true.
if(!force) if(!g->is_empty(x, y) || !can_move_to(g, x, y)) {
return 0;
}
if (has_effect(ME_BEARTRAP)) {
moves = 0;
return 0;
}
if (plans.size() > 0) {
plans.erase(plans.begin());
}
moves -= calc_movecost(g, posx(), posy(), x, y);
//Check for moving into/out of water
bool was_water = g->m.is_divable(posx(), posy());
bool will_be_water = g->m.is_divable(x, y);
if(was_water && !will_be_water && g->u_see(x, y)) {
//Use more dramatic messages for swimming monsters
g->add_msg(_("A %s %s from the %s!"), name().c_str(),
has_flag(MF_SWIMS) || has_flag(MF_AQUATIC) ? _("leaps") : _("emerges"),
g->m.tername(posx(), posy()).c_str());
} else if(!was_water && will_be_water && g->u_see(x, y)) {
g->add_msg(_("A %s %s into the %s!"), name().c_str(),
has_flag(MF_SWIMS) || has_flag(MF_AQUATIC) ? _("dives") : _("sinks"),
g->m.tername(x, y).c_str());
}
setpos(x, y);
footsteps(g, x, y);
if(is_hallucination()) {
//Hallucinations don't do any of the stuff after this point
return 1;
}
if (type->size != MS_TINY && g->m.has_flag("SHARP", posx(), posy()) && !one_in(4)) {
hurt(rng(2, 3));
}
if (type->size != MS_TINY && g->m.has_flag("ROUGH", posx(), posy()) && one_in(6)) {
hurt(rng(1, 2));
}
if (!digging() && !has_flag(MF_FLIES) &&
g->m.tr_at(posx(), posy()) != tr_null) { // Monster stepped on a trap!
trap* tr = g->traps[g->m.tr_at(posx(), posy())];
if (dice(3, type->sk_dodge + 1) < dice(3, tr->avoidance)) {
trapfuncm f;
(f.*(tr->actm))(g, this, posx(), posy());
}
}
// Diggers turn the dirt into dirtmound
if (digging()){
int factor = 0;
switch (type->size) {
case MS_TINY:
factor = 100;
break;
case MS_SMALL:
factor = 30;
break;
case MS_MEDIUM:
factor = 6;
break;
case MS_LARGE:
factor = 3;
break;
case MS_HUGE:
factor = 1;
break;
}
if (has_flag(MF_VERMIN)) {
factor *= 100;
}
if (one_in(factor)) {
g->m.ter_set(posx(), posy(), t_dirtmound);
}
}
// Acid trail monsters leave... a trail of acid
if (has_flag(MF_ACIDTRAIL)){
g->m.add_field(g, posx(), posy(), fd_acid, 3);
}
if (has_flag(MF_SLUDGETRAIL)) {
for (int dx = -1; dx <= 1; dx++) {
for (int dy = -1; dy <= 1; dy++) {
const int fstr = 3 - (abs(dx) + abs(dy));
if (fstr >= 2) {
g->m.add_field(g, posx() + dx, posy() + dy, fd_sludge, fstr);
}
}
}
}
return 1;
}
开发者ID:StrangerState,项目名称:Cataclysm-DDA,代码行数:98,代码来源:monmove.cpp
示例6: polymon
//.........这里部分代码省略.........
* Currently only strength gets changed.
*/
if (strongmonst(&mons[mntmp])) ABASE(A_STR) = AMAX(A_STR) = STR18(100);
if (Stone_resistance && Stoned) { /* [email protected] */
Stoned = 0;
delayed_killer = 0;
pline("You no longer seem to be petrifying.");
}
if (Sick_resistance && Sick) {
make_sick(0L, NULL, FALSE, SICK_ALL);
pline("You no longer feel sick.");
}
if (Slimed) {
if (flaming(youmonst.data)) {
pline("The slime burns away!");
Slimed = 0L;
iflags.botl = 1;
} else if (mntmp == PM_GREEN_SLIME) {
/* do it silently */
Slimed = 0L;
iflags.botl = 1;
}
}
if (nohands(youmonst.data)) Glib = 0;
/*
mlvl = adj_lev(&mons[mntmp]);
* We can't do the above, since there's no such thing as an
* "experience level of you as a monster" for a polymorphed character.
*/
mlvl = (int)mons[mntmp].mlevel;
if (youmonst.data->mlet == S_DRAGON && mntmp >= PM_GRAY_DRAGON) {
u.mhmax = In_endgame(&u.uz) ? (8*mlvl) : (4*mlvl + dice(mlvl,4));
} else if (is_golem(youmonst.data)) {
u.mhmax = golemhp(mntmp);
} else {
if (!mlvl) u.mhmax = rnd(4);
else u.mhmax = dice(mlvl, 8);
if (is_home_elemental(&u.uz, &mons[mntmp])) u.mhmax *= 3;
}
u.mh = u.mhmax;
if (u.ulevel < mlvl) {
/* Low level characters can't become high level monsters for long */
u.mtimedone = u.mtimedone * u.ulevel / mlvl;
}
if (uskin && mntmp != armor_to_dragon(uskin->otyp))
skinback(FALSE);
break_armor();
drop_weapon(1);
if (hides_under(youmonst.data))
u.uundetected = OBJ_AT(u.ux, u.uy);
else if (youmonst.data->mlet == S_EEL)
u.uundetected = is_pool(level, u.ux, u.uy);
else
u.uundetected = 0;
if (u.utraptype == TT_PIT) {
if (could_pass_walls && !Passes_walls) {
u.utrap = rn1(6,2);
} else if (!could_pass_walls && Passes_walls) {
u.utrap = 0;
}
}
开发者ID:DanielT,项目名称:NitroHack,代码行数:67,代码来源:polyself.c
示例7: rng
void faction::randomize()
{
// Set up values
// TODO: Not always in overmap 0,0
omx = 0;
omy = 0;
mapx = rng(OMAPX / 10, OMAPX - OMAPX / 10);
mapy = rng(OMAPY / 10, OMAPY - OMAPY / 10);
// Pick an overall goal.
goal = faction_goal(rng(1, NUM_FACGOALS - 1));
if (one_in(4))
goal = FACGOAL_NONE; // Slightly more likely to not have a real goal
good = facgoal_data[goal].good;
strength = facgoal_data[goal].strength;
sneak = facgoal_data[goal].sneak;
crime = facgoal_data[goal].crime;
cult = facgoal_data[goal].cult;
job1 = faction_job(rng(1, NUM_FACJOBS - 1));
do
job2 = faction_job(rng(0, NUM_FACJOBS - 1));
while (job2 == job1);
good += facjob_data[job1].good + facjob_data[job2].good;
strength += facjob_data[job1].strength + facjob_data[job2].strength;
sneak += facjob_data[job1].sneak + facjob_data[job2].sneak;
crime += facjob_data[job1].crime + facjob_data[job2].crime;
cult += facjob_data[job1].cult + facjob_data[job2].cult;
int num_values = 0;
int tries = 0;
values = 0;
do {
int v = rng(1, NUM_FACVALS - 1);
if (!has_value(faction_value(v)) && matches_us(faction_value(v))) {
values |= mfb(v);
tries = 0;
num_values++;
good += facval_data[v].good;
strength += facval_data[v].strength;
sneak += facval_data[v].sneak;
crime += facval_data[v].crime;
cult += facval_data[v].cult;
} else
tries++;
} while((one_in(num_values) || one_in(num_values)) && tries < 15);
std::string noun;
int sel = 1, best = strength;
if (sneak > best) {
sel = 2;
best = sneak;
}
if (crime > best) {
sel = 3;
best = crime;
}
if (cult > best)
sel = 4;
if (strength <= 0 && sneak <= 0 && crime <= 0 && cult <= 0)
sel = 0;
switch (sel) {
case 1:
noun = faction_noun_strong[rng(0, 14)];
power = dice(5, 20);
size = dice(5, 6);
break;
case 2:
noun = faction_noun_sneak [rng(0, 14)];
power = dice(5, 8);
size = dice(5, 8);
break;
case 3:
noun = faction_noun_crime [rng(0, 14)];
power = dice(5, 16);
size = dice(5, 8);
break;
case 4:
noun = faction_noun_cult [rng(0, 14)];
power = dice(8, 8);
size = dice(4, 6);
break;
default:
noun = faction_noun_none [rng(0, 14)];
power = dice(6, 8);
size = dice(6, 6);
}
if (one_in(4)) {
do
name = _("The ") + noun + _(" of ") + invent_name();
while (name.length() > MAX_FAC_NAME_SIZE);
}
else if (one_in(2)) {
do
name = _("The ") + invent_adj() + " " + noun;
while (name.length() > MAX_FAC_NAME_SIZE);
}
else {
do {
std::string adj;
//.........这里部分代码省略.........
开发者ID:Uvadzucumi,项目名称:Cataclysm,代码行数:101,代码来源:faction.cpp
示例8: invent_adj
std::string invent_adj()
{
int syllables = dice(2, 2) - 1;
std::string ret, tmp;
switch (rng(0, 25)) {
case 0: ret = "Ald"; break;
case 1: ret = "Brogg"; break;
case 2: ret = "Cald"; break;
case 3: ret = "Dredd"; break;
case 4: ret = "Eld"; break;
case 5: ret = "Forr"; break;
case 6: ret = "Gugg"; break;
case 7: ret = "Horr"; break;
case 8: ret = "Ill"; break;
case 9: ret = "Jov"; break;
case 10: ret = "Kok"; break;
case 11: ret = "Lill"; break;
case 12: ret = "Moom"; break;
case 13: ret = "Nov"; break;
case 14: ret = "Orb"; break;
case 15: ret = "Perv"; break;
case 16: ret = "Quot"; break;
case 17: ret = "Rar"; break;
case 18: ret = "Suss"; break;
case 19: ret = "Torr"; break;
case 20: ret = "Umbr"; break;
case 21: ret = "Viv"; break;
case 22: ret = "Warr"; break;
case 23: ret = "Xen"; break;
case 24: ret = "Yend"; break;
case 25: ret = "Zor"; break;
}
for (int i = 0; i < syllables - 2; i++) {
switch (rng(0, 17)) {
case 0: tmp = "al"; break;
case 1: tmp = "arn"; break;
case 2: tmp = "astr"; break;
case 3: tmp = "antr"; break;
case 4: tmp = "ent"; break;
case 5: tmp = "ell"; break;
case 6: tmp = "ev"; break;
case 7: tmp = "emm"; break;
case 8: tmp = "empr"; break;
case 9: tmp = "ill"; break;
case 10: tmp = "ial"; break;
case 11: tmp = "ior"; break;
case 12: tmp = "ordr"; break;
case 13: tmp = "oth"; break;
case 14: tmp = "omn"; break;
case 15: tmp = "uv"; break;
case 16: tmp = "ulv"; break;
case 17: tmp = "urn"; break;
}
ret += tmp;
}
switch (rng(0, 24)) {
case 0: tmp = ""; break;
case 1: tmp = "al"; break;
case 2: tmp = "an"; break;
case 3: tmp = "ard"; break;
case 4: tmp = "ate"; break;
case 5: tmp = "e"; break;
case 6: tmp = "ed"; break;
case 7: tmp = "en"; break;
case 8: tmp = "er"; break;
case 9: tmp = "ial"; break;
case 10: tmp = "ian"; break;
case 11: tmp = "iated"; break;
case 12: tmp = "ier"; break;
case 13: tmp = "ious"; break;
case 14: tmp = "ish"; break;
case 15: tmp = "ive"; break;
case 16: tmp = "oo"; break;
case 17: tmp = "or"; break;
case 18: tmp = "oth"; break;
case 19: tmp = "old"; break;
case 20: tmp = "ous"; break;
case 21: tmp = "ul"; break;
case 22: tmp = "un"; break;
case 23: tmp = "ule"; break;
case 24: tmp = "y"; break;
}
ret += tmp;
return ret;
}
开发者ID:Uvadzucumi,项目名称:Cataclysm,代码行数:85,代码来源:faction.cpp
示例9: dice
int player::dodge_roll()
{
return dice(dodge(), 6);
}
开发者ID:Azrael,项目名称:Cataclysm,代码行数:4,代码来源:melee.cpp
示例10: unarmed_attack
//.........这里部分代码省略.........
}
dam += rng(1, sklevel[sk_unarmed]);
practice(sk_unarmed, 2);
}
// Melee skill bonus
dam += rng(0, sklevel[sk_melee]);
// Bashing damage bonus
int bash_dam = weapon.type->melee_dam,
bash_cap = 5 + str_cur + sklevel[sk_bashing];
if (bash_dam > bash_cap)// Cap for weak characters
bash_dam = (bash_cap * 3 + bash_dam) / 4;
if (bashing)
bash_dam += rng(0, sklevel[sk_bashing]) * sqrt(str_cur);
int bash_min = bash_dam / 4;
if (bash_min < sklevel[sk_bashing] * 2)
bash_min = sklevel[sk_bashing] * 2;
dam += rng(bash_dam / 4, bash_dam);
// Take some moves away from the target; at this point it's skill & bash damage
z->moves -= rng(0, dam * 2);
// Spears treat cutting damage specially.
if (weapon.has_weapon_flag(WF_SPEAR) &&
weapon.type->melee_cut > z->type->armor - int(sklevel[sk_stabbing])) {
int z_armor = z->type->armor - int(sklevel[sk_stabbing]);
dam += int(weapon.type->melee_cut / 5);
int minstab = sklevel[sk_stabbing] * 8 + weapon.type->melee_cut * 2,
maxstab = sklevel[sk_stabbing] * 20 + weapon.type->melee_cut * 4;
int monster_penalty = rng(minstab, maxstab);
if (monster_penalty >= 150)
g->add_msg("You force the %s to the ground!", z->name().c_str());
else if (monster_penalty >= 80)
g->add_msg("The %s is skewered and flinches!", z->name().c_str());
z->moves -= monster_penalty;
cutting_penalty = weapon.type->melee_cut * 4 + z_armor * 8 -
dice(sklevel[sk_stabbing], 10);
practice(sk_stabbing, 2);
// Cutting damage bonus
} else if (weapon.type->melee_cut >
z->type->armor - int(sklevel[sk_cutting] / 2)) {
int z_armor = z->type->armor - int(sklevel[sk_cutting] / 2);
if (z_armor < 0)
z_armor = 0;
dam += weapon.type->melee_cut - z_armor;
cutting_penalty = weapon.type->melee_cut * 3 + z_armor * 8 -
dice(sklevel[sk_cutting], 10);
}
if (weapon.has_weapon_flag(WF_MESSY)) { // e.g. chainsaws
cutting_penalty /= 6; // Harder to get stuck
for (int x = z->posx - 1; x <= z->posx + 1; x++) {
for (int y = z->posy - 1; y <= z->posy + 1; y++) {
if (!one_in(3)) {
if (g->m.field_at(x, y).type == fd_blood &&
g->m.field_at(x, y).density < 3)
g->m.field_at(x, y).density++;
else
g->m.add_field(g, x, y, fd_blood, 1);
}
}
}
}
// Bonus attacks!
bool shock_them = (!z->has_flag(MF_SHOCK) && has_bionic(bio_shock) &&
power_level >= 2 && unarmed && one_in(3));
bool drain_them = (has_bionic(bio_heat_absorb) && power_level >= 1 &&
!is_armed() && z->has_flag(MF_WARM));
开发者ID:Azrael,项目名称:Cataclysm,代码行数:67,代码来源:melee.cpp
示例11: cutworm
/* cutworm()
*
* Check for mon->wormno before calling this function!
*
* When hitting a worm (worm) at position x, y, with a weapon (weap),
* there is a chance that the worm will be cut in half, and a chance
* that both halves will survive.
*/
void
cutworm(struct monst *worm, xchar x, xchar y, struct obj *weap)
{
struct wseg *curr, *new_tail;
struct monst *new_worm;
int wnum = worm->wormno;
int cut_chance, new_wnum;
if (!wnum)
return; /* bullet proofing */
if (x == worm->mx && y == worm->my)
return; /* hit on head */
/* cutting goes best with a bladed weapon */
cut_chance = rnd(20); /* Normally 1-16 does not cut */
/* Normally 17-20 does */
if (weap && objects[weap->otyp].oc_dir & SLASH)
cut_chance += 10; /* With a slashing weapon 1- 6 does not cut */
/* 7-20 does */
if (cut_chance < 17)
return; /* not good enough */
/* Find the segment that was attacked. */
curr = level->wtails[wnum];
while ((curr->wx != x) || (curr->wy != y)) {
curr = curr->nseg;
if (!curr) {
impossible("cutworm: no segment at (%d,%d)", (int)x, (int)y);
return;
}
}
/* If this is the tail segment, then the worm just loses it. */
if (curr == level->wtails[wnum]) {
shrink_worm(wnum);
return;
}
/*
* Split the worm. The tail for the new worm is the old worm's tail.
* The tail for the old worm is the segment that follows "curr",
* and "curr" becomes the dummy segment under the new head.
*/
new_tail = level->wtails[wnum];
level->wtails[wnum] = curr->nseg;
curr->nseg = NULL; /* split the worm */
/*
* At this point, the old worm is correct. Any new worm will have
* it's head at "curr" and its tail at "new_tail".
*/
/* Sometimes the tail end dies. */
if (rn2(3) || !(new_wnum = get_wormno(level)) || !worm->m_lev) {
cutoff(worm, new_tail);
return;
}
remove_monster(level, x, y); /* clone_mon puts new head here */
if (!(new_worm = clone_mon(worm, x, y))) {
cutoff(worm, new_tail);
return;
}
new_worm->wormno = new_wnum; /* affix new worm number */
/* Devalue the monster level of both halves of the worm. */
worm->m_lev =
((unsigned)worm->m_lev <=
3) ? (unsigned)worm->m_lev : max((unsigned)worm->m_lev - 2, 3);
new_worm->m_lev = worm->m_lev;
/* Calculate the mhp on the new_worm for the (lower) monster level. */
new_worm->mhpmax = new_worm->mhp = dice((int)new_worm->m_lev, 8);
/* Calculate the mhp on the old worm for the (lower) monster level. */
if (worm->m_lev > 3) {
worm->mhpmax = dice((int)worm->m_lev, 8);
if (worm->mhpmax < worm->mhp)
worm->mhp = worm->mhpmax;
}
level->wtails[new_wnum] = new_tail; /* We've got all the info right now */
level->wheads[new_wnum] = curr; /* so we can do this faster than */
level->wgrowtime[new_wnum] = 0L; /* trying to call initworm(). */
/* Place the new monster at all the segment locations. */
place_wsegs(new_worm);
//.........这里部分代码省略.........
开发者ID:FredrIQ,项目名称:fiqhack,代码行数:101,代码来源:worm.c
示例12: newwin
void game::complete_craft()
{
recipe making = recipes[u.activity.index]; // Which recipe is it?
std::vector<component> will_use; // List of all items we're using, w/ count
// Up to 5 components / tools
for (int i = 0; i < 5; i++) {
if (making.components[i].size() > 0) {
// For each set of components in the recipe, fill you_have with the list of all
// matching ingredients the player has.
std::vector<component> you_have;
for (int j = 0; j < making.components[i].size(); j++) {
if (u.has_amount(making.components[i][j].type,
making.components[i][j].count))
you_have.push_back(making.components[i][j]);
}
if (you_have.size() == 1) // Only one, so we'll definitely use it
will_use.push_back(component(you_have[0].type, you_have[0].count));
else { // Let the player pick which component they want to use
WINDOW* w = newwin(you_have.size() + 2, 30, 10, 25);
wborder(w, LINE_XOXO, LINE_XOXO, LINE_OXOX, LINE_OXOX,
LINE_OXXO, LINE_OOXX, LINE_XXOO, LINE_XOOX );
mvwprintz(w, 0, 5, c_red, "Use which component?");
for (int j = 0; j < you_have.size(); j++)
mvwprintz(w, j + 1, 1, c_white, "%d: %s", j + 1,
itypes[you_have[j].type]->name.c_str());
wrefresh(w);
char ch;
do
ch = getch();
while (ch < '1' || ch >= '1' + you_have.size());
ch -= '1';
will_use.push_back(component(you_have[ch].type, you_have[ch].count));
delwin(w);
}
} // Done looking at components
// Use charges of any tools that require charges used
if (making.tools[i].size() > 0) {
for (int j = 0; j < making.tools[i].size(); j++) {
if (making.tools[i][j].count > 0)
u.use_charges(making.tools[i][j].type, making.tools[i][j].count);
}
}
} // Done finding the components/tools needed
// # of dice is 75% primary skill, 25% secondary (unless secondary is null)
int skill_dice = u.sklevel[making.sk_primary] * 3;
if (making.sk_secondary == sk_null)
skill_dice += u.sklevel[making.sk_primary];
else
skill_dice += u.sklevel[making.sk_secondary];
// Sides on dice is 16 plus your current intelligence
int skill_sides = 16 + u.int_cur;
int diff_dice = making.difficulty * 4; // Since skill level is * 4 also
int diff_sides = 24; // 16 + 8 (default intelligence)
int skill_roll = dice(skill_dice, skill_sides);
int diff_roll = dice(diff_dice, diff_sides);
if (making.sk_primary != sk_null)
u.practice(making.sk_primary, making.difficulty * 5 + 20);
if (making.sk_secondary != sk_null)
u.practice(making.sk_secondary, 5);
// Messed up badly; waste some components.
if (making.difficulty != 0 && diff_roll > skill_roll * (1 + 0.1 * rng(1, 5))) {
add_msg("You fail to make the %s, and waste some materials.",
itypes[making.result]->name.c_str());
int num_lost = rng(1, will_use.size());
for (int i = 0; i < num_lost; i++) {
int n = rng(0, will_use.size() - 1);
if (itypes[will_use[n].type]->is_ammo() && will_use[i].type != itm_gasoline)
u.use_charges(will_use[n].type, will_use[n].count);
else
u.use_amount(will_use[n].type, will_use[n].count);
will_use.erase(will_use.begin() + n);
}
u.activity.type = ACT_NULL;
return;
// Messed up slightly; no components wasted.
} else if (diff_roll > skill_roll) {
add_msg("You fail to make the %s, but don't waste any materials.",
itypes[making.result]->name.c_str());
u.activity.type = ACT_NULL;
return;
}
// If we're here, the craft was a success!
// Use up the items in will_use
for (int i = 0; i < will_use.size(); i++) {
if (itypes[will_use[i].type]->is_ammo() && will_use[i].type != itm_gasoline)
u.use_charges(will_use[i].type, will_use[i].count);
else
u.use_amount(will_use[i].type, will_use[i].count);
}
// Set up the new item, and pick an inventory letter
int iter = 0;
//.........这里部分代码省略.........
开发者ID:headswe,项目名称:Cataclysm,代码行数:101,代码来源:crafting.cpp
示例13: add_msg
bool game::grabbed_veh_move( const tripoint &dp )
{
const optional_vpart_position grabbed_vehicle_vp = m.veh_at( u.pos() + u.grab_point );
if( !grabbed_vehicle_vp ) {
add_msg( m_info, _( "No vehicle at grabbed point." ) );
u.grab( OBJECT_NONE );
return false;
}
vehicle *grabbed_vehicle = &grabbed_vehicle_vp->vehicle();
const int grabbed_part = grabbed_vehicle_vp->part_index();
const vehicle *veh_under_player = veh_pointer_or_null( m.veh_at( u.pos() ) );
if( grabbed_vehicle == veh_under_player ) {
u.grab_point = -dp;
return false;
}
tripoint dp_veh = -u.grab_point;
const tripoint prev_grab = u.grab_point;
tripoint next_grab = u.grab_point;
bool zigzag = false;
if( dp == prev_grab ) {
// We are pushing in the direction of vehicle
dp_veh = dp;
} else if( abs( dp.x + dp_veh.x ) != 2 && abs( dp.y + dp_veh.y ) != 2 ) {
// Not actually moving the vehicle, don't do the checks
u.grab_point = -( dp + dp_veh );
return false;
} else if( ( dp.x == prev_grab.x || dp.y == prev_grab.y ) &&
next_grab.x != 0 && next_grab.y != 0 ) {
// Zig-zag (or semi-zig-zag) pull: player is diagonal to vehicle
// and moves away from it, but not directly away
dp_veh.x = ( dp.x == -dp_veh.x ) ? 0 : dp_veh.x;
dp_veh.y = ( dp.y == -dp_veh.y ) ? 0 : dp_veh.y;
next_grab = -dp_veh;
zigzag = true;
} else {
// We are pulling the vehicle
next_grab = -dp;
}
// Make sure the mass and pivot point are correct
grabbed_vehicle->invalidate_mass();
//vehicle movement: strength check
int mc = 0;
int str_req = ( grabbed_vehicle->total_mass() / 25_kilogram ); //strength required to move vehicle.
//if vehicle is rollable we modify str_req based on a function of movecost per wheel.
// Vehicle just too big to grab & move; 41-45 lets folks have a bit of a window
// (Roughly 1.1K kg = danger zone; cube vans are about the max)
if( str_req > 45 ) {
add_msg( m_info, _( "The %s is too bulky for you to move by hand." ),
grabbed_vehicle->name );
return true; // No shoving around an RV.
}
const auto &wheel_indices = grabbed_vehicle->wheelcache;
if( grabbed_vehicle->valid_wheel_config() ) {
//determine movecost for terrain touching wheels
const tripoint vehpos = grabbed_vehicle->global_pos3();
for( int p : wheel_indices ) {
const tripoint wheel_pos = vehpos + grabbed_vehicle->parts[p].precalc[0];
const int mapcost = m.move_cost( wheel_pos, grabbed_vehicle );
mc += ( str_req / wheel_indices.size() ) * mapcost;
}
//set strength check threshold
//if vehicle has many or only one wheel (shopping cart), it is as if it had four.
if( wheel_indices.size() > 4 || wheel_indices.size() == 1 ) {
str_req = mc / 4 + 1;
} else {
str_req = mc / wheel_indices.size() + 1;
}
} else {
str_req++;
//if vehicle has no wheels str_req make a noise.
if( str_req <= u.get_str() ) {
sounds::sound( grabbed_vehicle->global_pos3(), str_req * 2, sounds::sound_t::movement,
_( "a scraping noise." ), true, "misc", "scraping" );
}
}
//final strength check and outcomes
///\EFFECT_STR determines ability to drag vehicles
if( str_req <= u.get_str() ) {
//calculate exertion factor and movement penalty
///\EFFECT_STR increases speed of dragging vehicles
u.moves -= 100 * str_req / std::max( 1, u.get_str() );
const int ex = dice( 1, 3 ) - 1 + str_req;
if( ex > u.get_str() ) {
add_msg( m_bad, _( "You strain yourself to move the %s!" ), grabbed_vehicle->name );
u.moves -= 200;
u.mod_pain( 1 );
} else if( ex == u.get_str() ) {
u.moves -= 200;
add_msg( _( "It takes some time to move the %s." ), grabbed_vehicle->name );
//.........这里部分代码省略.........
开发者ID:CleverRaven,项目名称:Cataclysm-DDA,代码行数:101,代码来源:grab.cpp
示例14: main
int main (int argc, char** argv)
{
if(argc != 4+1 )
{
std::cerr<<" The function :"<<argv[0]<<" should be called with the following parameters: "<< std::endl
<<" config_file Puddle_Height[eV] Puddle_Concentration[0-1] Puddle_Range[lat_unit]."<<std::endl;
return 0;
}
//Read the name of the configuration file
const std::string config_filename(argv[1]);
const double puddHeight=atof(argv[2]);
const double puddConcen=atof(argv[3]);
const double puddRange =atof(argv[4]);
std::ifstream config_file(config_filename.c_str());
///Look for the line lattice_info
std::string line;
bool found=false;
for (int line_num = 0; std::getline(config_file, line); ++line_num)
if(line=="lattice_info")
{
found=true;
break;
}
if(!found)
{
config_file.close();
std::cerr<<"The config file does not posses a disorder_info section. The simulation cannot proceed"<<std::endl;
return 0;
}
std::string label;
int OrbitalNum=0;
int SpinNum=0;
int coord=0;
std::vector<int> SitesInDir(3);
std::vector < std::vector<double> > lat(3);
for(int i=0;i<3;i++)
lat[i]=std::vector<double>(3,0);
config_file >>label
>>lat[0][0]>>lat[0][1]>>lat[0][2]
>>lat[1][0]>>lat[1][1]>>lat[1][2]
>>lat[2][0]>>lat[2][1]>>lat[2][2]
>>SitesInDir[0]>>SitesInDir[1]>>SitesInDir[2]
>>OrbitalNum>>SpinNum>>coord;
const double Delta[] = { (lat[0][0]+lat[1][0])/3. , (lat[0][1]+lat[1][1])/3. , 0 }; // THIRD LATTICE VECTOR
std::string output_name=label+"PuddleHeight"+
argv[2]+"eVConc"+argv[3]+
"Range"+argv[4]+"nm.dis";
std::ofstream output_file(output_name.c_str());
const double epsilon=std::numeric_limits<double>::epsilon();
if(puddHeight <= epsilon || puddConcen <= epsilon)
{
output_file.close();
return 0;
}
boost::random::mt19937 rng; // produces randomness out of thin air
boost::random::uniform_01<double> dice;
boost::random::uniform_real_distribution<double> RandomEnergy( -1.0 , 1.0);
///Number of orbitals in the simulation
const int TotalOfOrbitals=SitesInDir[0]*SitesInDir[0]*SitesInDir[2]*OrbitalNum*SpinNum;
///Stimated number of impurities
const int estImpNum= (1.3)*puddConcen * TotalOfOrbitals/SpinNum;//The two is to overstimate the value
std::vector< std::vector< double > > impPosition;
impPosition.reserve( estImpNum );
std::cout<<"The estimated number of puddles is set as: "<<estImpNum<<std::endl;
std::vector< double >
this_imp_pos(3); //a singl impurity position
int impurity_count= 0;
// first we go through all the possible positions
for(int i2=0; i2 < SitesInDir[2] ; i2++ )
for(int i1=0; i1 < SitesInDir[1] ; i1++ )
for(int i0=0; i0 < SitesInDir[0] ; i0++ )
for(int io=0; io < OrbitalNum ; io++ )
if( dice(rng) < puddConcen )
{
this_imp_pos[0]=lat[0][0]*i0 + lat[1][0]*i1 + lat[2][0]*i2 + io*Delta[0];
this_imp_pos[1]=lat[0][1]*i0 + lat[1][1]*i1 + lat[2][1]*i2 + io*Delta[1];
this_imp_pos[1]=lat[0][2]*i0 + lat[1][2]*i1 + lat[2][2]*i2 + io*Delta[2];
impPosition.push_back(this_imp_pos);
//.........这里部分代码省略.........
开发者ID:adamecius,项目名称:TB-QuantumTransp,代码行数:101,代码来源:puddle_generator.cpp
示例15: weather_change
//.........这里部分代码省略.........
case 4: // May
diff = (weath
|
请发表评论