forked from CleverRaven/Cataclysm-DDA
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathplayer_helpers.cpp
190 lines (164 loc) · 5.28 KB
/
player_helpers.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
#include "catch/catch.hpp"
#include "player_helpers.h"
#include <cstddef>
#include <list>
#include <memory>
#include <vector>
#include "avatar.h"
#include "bionics.h"
#include "character.h"
#include "character_id.h"
#include "game.h"
#include "inventory.h"
#include "item.h"
#include "itype.h"
#include "map.h"
#include "material.h"
#include "npc.h"
#include "pimpl.h"
#include "player.h"
#include "player_activity.h"
#include "point.h"
#include "string_id.h"
#include "type_id.h"
int get_remaining_charges( const std::string &tool_id )
{
const inventory crafting_inv = get_player_character().crafting_inventory();
std::vector<const item *> items =
crafting_inv.items_with( [tool_id]( const item & i ) {
return i.typeId() == itype_id( tool_id );
} );
int remaining_charges = 0;
for( const item *instance : items ) {
remaining_charges += instance->ammo_remaining();
}
return remaining_charges;
}
bool player_has_item_of_type( const std::string &type )
{
std::vector<item *> matching_items = get_player_character().inv.items_with(
[&]( const item & i ) {
return i.type->get_id() == itype_id( type );
} );
return !matching_items.empty();
}
void clear_character( player &dummy, bool debug_storage )
{
dummy.set_body();
dummy.normalize(); // In particular this clears martial arts style
// delete all worn items.
dummy.worn.clear();
dummy.calc_encumbrance();
dummy.inv.clear();
dummy.remove_weapon();
dummy.clear_mutations();
// Prevent spilling, but don't cause encumbrance
if( debug_storage && !dummy.has_trait( trait_id( "DEBUG_STORAGE" ) ) ) {
dummy.set_mutation( trait_id( "DEBUG_STORAGE" ) );
}
// Clear stomach and then eat a nutritious meal to normalize stomach
// contents (needs to happen before clear_morale).
dummy.stomach.empty();
dummy.guts.empty();
item food( "debug_nutrition" );
dummy.consume( food );
dummy.empty_skills();
dummy.martial_arts_data.clear_styles();
dummy.clear_morale();
dummy.clear_bionics();
dummy.activity.set_to_null();
dummy.reset_chargen_attributes();
dummy.set_pain( 0 );
dummy.reset_bonuses();
dummy.set_speed_base( 100 );
dummy.set_speed_bonus( 0 );
// Restore all stamina and go to walk mode
dummy.set_stamina( dummy.get_stamina_max() );
dummy.set_movement_mode( move_mode_id( "walk" ) );
dummy.reset_activity_level();
// Make sure we don't carry around weird effects.
dummy.clear_effects();
// Make stats nominal.
dummy.str_max = 8;
dummy.dex_max = 8;
dummy.int_max = 8;
dummy.per_max = 8;
dummy.set_str_bonus( 0 );
dummy.set_dex_bonus( 0 );
dummy.set_int_bonus( 0 );
dummy.set_per_bonus( 0 );
dummy.reset_bonuses();
dummy.set_speed_base( 100 );
dummy.set_speed_bonus( 0 );
dummy.set_all_parts_hp_to_max();
dummy.cash = 0;
const tripoint spot( 60, 60, 0 );
dummy.setpos( spot );
}
void clear_avatar( bool debug_storage )
{
clear_character( get_avatar(), debug_storage );
}
void process_activity( player &dummy )
{
do {
dummy.moves += dummy.get_speed();
while( dummy.moves > 0 && dummy.activity ) {
dummy.activity.do_turn( dummy );
}
} while( dummy.activity );
}
npc &spawn_npc( const point &p, const std::string &npc_class )
{
const string_id<npc_template> test_guy( npc_class );
const character_id model_id = get_map().place_npc( p, test_guy );
g->load_npcs();
npc *guy = g->find_npc( model_id );
REQUIRE( guy != nullptr );
CHECK( !guy->in_vehicle );
return *guy;
}
void give_and_activate_bionic( player &p, bionic_id const &bioid )
{
INFO( "bionic " + bioid.str() + " is valid" );
REQUIRE( bioid.is_valid() );
p.add_bionic( bioid );
INFO( "dummy has gotten " + bioid.str() + " bionic " );
REQUIRE( p.has_bionic( bioid ) );
// get bionic's index - might not be "last added" due to "integrated" ones
int bioindex = -1;
for( size_t i = 0; i < p.my_bionics->size(); i++ ) {
const auto &bio = ( *p.my_bionics )[ i ];
if( bio.id == bioid ) {
bioindex = i;
}
}
REQUIRE( bioindex != -1 );
const bionic &bio = p.bionic_at_index( bioindex );
REQUIRE( bio.id == bioid );
// turn on if possible
if( bio.id->has_flag( "BIONIC_TOGGLED" ) && !bio.powered ) {
const std::vector<itype_id> fuel_opts = bio.info().fuel_opts;
if( !fuel_opts.empty() ) {
p.set_value( fuel_opts.front().str(), "2" );
}
p.activate_bionic( bioindex );
INFO( "bionic " + bio.id.str() + " with index " + std::to_string( bioindex ) + " is active " );
REQUIRE( p.has_active_bionic( bioid ) );
if( !fuel_opts.empty() ) {
p.remove_value( fuel_opts.front().str() );
}
}
}
item tool_with_ammo( const std::string &tool, const int qty )
{
item tool_it( tool );
if( !tool_it.ammo_default().is_null() ) {
tool_it.ammo_set( tool_it.ammo_default(), qty );
} else if( !tool_it.magazine_default().is_null() ) {
item tool_it_mag( tool_it.magazine_default() );
tool_it_mag.ammo_set( tool_it_mag.ammo_default(), qty );
tool_it.put_in( tool_it_mag, item_pocket::pocket_type::MAGAZINE_WELL );
}
return tool_it;
}