Simutrans-Squirrel-API  r11919
api_player.cc
Go to the documentation of this file.
1 /*
2  * This file is part of the Simutrans project under the Artistic License.
3  * (see LICENSE.txt)
4  */
5 
6 #include "api.h"
7 
10 #include "../api_class.h"
11 #include "../api_function.h"
12 #include "../../player/simplay.h"
13 #include "../../player/finance.h"
14 
15 // for creation of lines
16 #include "../../simline.h"
17 #include "../../tool/simmenu.h"
18 #include "../../world/simworld.h"
19 
20 
21 using namespace script_api;
22 
23 vector_tpl<sint64> const& get_player_stat(player_t *player, sint32 INDEX, sint32 TTYPE, bool monthly)
24 {
25  static vector_tpl<sint64> v;
26  v.clear();
27  bool atv = false;
28  if (TTYPE<0 || TTYPE>=TT_MAX) {
29  if (INDEX<0 || INDEX>ATC_MAX) {
30  return v;
31  }
32  }
33  else {
34  if (INDEX<0 || INDEX>ATV_MAX) {
35  return v;
36  }
37  atv = true;
38  }
39  if (player) {
40  finance_t *finance = player->get_finance();
41  // calculate current month
42  finance->calc_finance_history();
43  uint16 maxi = monthly ? MAX_PLAYER_HISTORY_MONTHS : MAX_PLAYER_HISTORY_YEARS;
44  for(uint16 i = 0; i < maxi; i++) {
45  sint64 m = atv ? ( monthly ? finance->get_history_veh_month((transport_type)TTYPE, i, INDEX) : finance->get_history_veh_year((transport_type)TTYPE, i, INDEX) )
46  : ( monthly ? finance->get_history_com_month(i, INDEX) : finance->get_history_com_year(i, INDEX) );
47  if (atv) {
48  if (INDEX != ATV_TRANSPORTED_PASSENGER && INDEX != ATV_TRANSPORTED_MAIL && INDEX != ATV_TRANSPORTED_GOOD && INDEX !=ATV_TRANSPORTED) {
49  m = convert_money(m);
50  }
51  }
52  else {
53  if (INDEX != ATC_ALL_CONVOIS) {
54  m = convert_money(m);
55  }
56  }
57  v.append(m);
58  }
59  }
60  return v;
61 }
62 
63 
64 // export of finance_t only here
65 namespace script_api {
66  declare_specialized_param(finance_t*, param<player_t*>::typemask(), param<player_t*>::squirrel_type());
67 
68  finance_t* param<finance_t*>::get(HSQUIRRELVM vm, SQInteger index)
69  {
70  player_t *player = param<player_t*>::get(vm, index);
71  return player ? player->get_finance() : NULL;
72  }
73 };
74 // also export transport_type - to get correct parameters
75 namespace script_api {
76  declare_specialized_param(transport_type, "i", "integer");
77 
78  transport_type param<transport_type>::get(HSQUIRRELVM vm, SQInteger index)
79  {
80  return (transport_type) min(param<uint16>::get(vm, index), TT_MAX-1);
81  }
82 };
83 
84 
85 SQInteger player_export_line_list(HSQUIRRELVM vm)
86 {
87  if (player_t* player = param<player_t*>::get(vm, 1)) {
88  push_instance(vm, "line_list_x");
89  set_slot(vm, "player_id", player->get_player_nr());
90  return 1;
91  }
92  return SQ_ERROR;
93 }
94 
95 call_tool_init player_create_line(player_t *player, waytype_t wt)
96 {
97  simline_t::linetype lt = simline_t::waytype_to_linetype(wt);
98  if (lt == simline_t::MAX_LINE_TYPE) {
99  return "Invalid waytype provided";
100  }
101  // build param string (see schedule_list_gui_t::action_triggered)
102  cbuffer_t buf;
103  buf.printf( "c,0,%i,0,0|%i|", lt, lt);
104  return call_tool_init(TOOL_CHANGE_LINE | SIMPLE_TOOL, buf, 0, player);
105 }
106 
107 call_tool_init player_book_account(player_t *player, sint32 delta)
108 {
109  // build param string (see tool_change_player_t)
110  cbuffer_t buf;
111  buf.printf( "$,%i,%i", player->get_player_nr(), delta);
112  return call_tool_init(TOOL_CHANGE_PLAYER | SIMPLE_TOOL, buf, 0, welt->get_public_player());
113 }
114 
115 SQInteger player_get_my_player(HSQUIRRELVM vm)
116 {
117  return script_api::param<player_t*>::push(vm, get_my_player(vm) );
118 }
119 
120 call_tool_init player_set_name(player_t *player, const char* name)
121 {
122  return script_api::command_rename(player, 'p', player->get_player_nr(), name);
123 }
124 
125 void export_player(HSQUIRRELVM vm, bool scenario)
126 {
131  begin_class(vm, "player_x", "extend_get,ingame_object");
132 
138  // actually defined in simutrans/script/script_base.nut
139  // register_function(..., "constructor", ...);
140 
144  export_is_valid<player_t*>(vm); //register_function("is_valid")
145 
146  if (!scenario) {
153  STATIC register_function(vm, &player_get_my_player, "self", 0, "", true);
154  }
159  register_method(vm, &player_t::get_headquarter_level, "get_headquarter_level");
164  register_method(vm, &player_t::get_headquarter_pos, "get_headquarter_pos");
169  register_method(vm, &player_t::get_name, "get_name");
175  register_method(vm, &player_set_name, "set_name", true);
180  register_method_fv(vm, &get_player_stat, "get_construction", freevariable<sint32,sint32,bool>(ATV_CONSTRUCTION_COST, TT_ALL, true), true);
185  register_method_fv(vm, &get_player_stat, "get_vehicle_maint", freevariable<sint32,sint32,bool>(ATV_RUNNING_COST, TT_ALL, true), true);
190  register_method_fv(vm, &get_player_stat, "get_new_vehicles", freevariable<sint32,sint32,bool>(ATV_NEW_VEHICLE, TT_ALL, true), true);
195  register_method_fv(vm, &get_player_stat, "get_income", freevariable<sint32,sint32,bool>(ATV_REVENUE_TRANSPORT, TT_ALL, true), true);
200  register_method_fv(vm, &get_player_stat, "get_maintenance", freevariable<sint32,sint32,bool>(ATV_INFRASTRUCTURE_MAINTENANCE, TT_ALL, true), true);
205  register_method_fv(vm, &get_player_stat, "get_assets", freevariable<sint32,sint32,bool>(ATV_NON_FINANCIAL_ASSETS, TT_ALL, true), true);
210  register_method_fv(vm, &get_player_stat, "get_cash", freevariable<sint32,sint32,bool>(ATC_CASH, -1, true), true);
215  register_method_fv(vm, &get_player_stat, "get_net_wealth", freevariable<sint32,sint32,bool>(ATC_NETWEALTH, -1, true), true);
220  register_method_fv(vm, &get_player_stat, "get_profit", freevariable<sint32,sint32,bool>(ATV_PROFIT, TT_ALL, true), true);
225  register_method_fv(vm, &get_player_stat, "get_operating_profit", freevariable<sint32,sint32,bool>(ATV_OPERATING_PROFIT, TT_ALL, true), true);
230  register_method_fv(vm, &get_player_stat, "get_margin", freevariable<sint32,sint32,bool>(ATV_PROFIT_MARGIN, -1, true), true);
235  register_method_fv(vm, &get_player_stat, "get_transported", freevariable<sint32,sint32,bool>(ATV_TRANSPORTED, TT_ALL, true), true);
240  register_method_fv(vm, &get_player_stat, "get_powerline", freevariable<sint32,sint32,bool>(ATV_REVENUE, TT_POWERLINE, true), true);
245  register_method_fv(vm, &get_player_stat, "get_transported_pax", freevariable<sint32,sint32,bool>(ATV_TRANSPORTED_PASSENGER, TT_ALL, true), true);
250  register_method_fv(vm, &get_player_stat, "get_transported_mail", freevariable<sint32,sint32,bool>(ATV_TRANSPORTED_MAIL, TT_ALL, true), true);
255  register_method_fv(vm, &get_player_stat, "get_transported_goods", freevariable<sint32,sint32,bool>(ATV_TRANSPORTED_GOOD, TT_ALL, true), true);
260  register_method_fv(vm, &get_player_stat, "get_convoys", freevariable<sint32,sint32,bool>(ATC_ALL_CONVOIS, -1, true), true);
265  register_method_fv(vm, &get_player_stat, "get_way_tolls", freevariable<sint32,sint32,bool>(ATV_WAY_TOLL, TT_ALL, true), true);
266 
267  if (scenario) {
273  register_method(vm, player_book_account, "book_cash", true);
274  }
278  register_method(vm, &player_t::get_account_balance_as_double, "get_current_cash");
282  register_method(vm, &finance_t::get_netwealth, "get_current_net_wealth");
286  register_method_fv(vm, &finance_t::get_maintenance_with_bits, "get_current_maintenance", freevariable<uint8>(TT_ALL));
293  // register_method(vm,, "is_active", true); implemented in scenario_compat.nut
298  register_function(vm, &player_export_line_list, "get_line_list", 1, param<player_t*>::typemask());
299 
305  register_method(vm, &player_create_line, "create_line", true);
309  register_method(vm, &player_t::get_ai_id, "get_type");
310 
311  end_class(vm);
312 }
struct @1 scenario