ship_base.gd 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774
  1. extends RigidBody2D
  2. # base script for ships
  3. var ship_type = ""
  4. var base = {}
  5. var equipment = []
  6. var inventory = []
  7. var reactors = []
  8. var engines = []
  9. var internal = []
  10. var external = []
  11. var weapons = []
  12. var turrets = []
  13. var missiles = []
  14. var num_reactors = 0
  15. var num_engines = 0
  16. var num_internal = 0
  17. var num_external = 0
  18. var num_weapons = 0
  19. var num_turrets = 0
  20. var num_missiles = 0
  21. var hp = 100
  22. var hp_max = 100
  23. var hr = 0.0
  24. var sp = 50
  25. var sp_max = 50
  26. var sr = 1.0
  27. var ep = 100
  28. var ep_max = 100
  29. var er = 0.0
  30. var temp = 100
  31. var temp_max = 1000
  32. var heat = 50.0
  33. var heat_dissipation = 0.05
  34. var cargo = 0.0
  35. var radar = 0.0
  36. var stealth = 0.0
  37. var crew = 0
  38. var crew_min = 1
  39. var la = 0.0
  40. var thrust_power = 0.0
  41. var thrust_heat = 0.0
  42. var steering_power = 0.0
  43. var steering_heat = 0.0
  44. var ts = 2.5
  45. var damping = 0.0
  46. var resist_impact = 0.0
  47. var resist_plasma = 0.0
  48. var resist_explosive = 0.0
  49. var average_weapon_speed = 0.0
  50. var missile_cd = 0.0
  51. var reactor_disabled = []
  52. var reactor_overheating = []
  53. var reactor_sp = []
  54. var reactor_sp_max = []
  55. var reactor_sr = []
  56. var engine_disabled = []
  57. var engine_sp = []
  58. var engine_sp_max = []
  59. var engine_sr = []
  60. var internal_disabled = []
  61. var internal_overheating = []
  62. var internal_no_power = []
  63. var internal_sp = []
  64. var internal_sp_max = []
  65. var internal_sr = []
  66. var external_disabled = []
  67. var external_overheating = []
  68. var external_no_power = []
  69. var external_sp = []
  70. var external_sp_max = []
  71. var external_sr = []
  72. var weapon_disabled = []
  73. var weapon_sp = []
  74. var weapon_sp_max = []
  75. var weapon_sr = []
  76. var weapon_temp = []
  77. var weapon_cd = []
  78. var weapon_ep = []
  79. var weapon_heat = []
  80. var weapon_st = []
  81. var weapon_max_temp = []
  82. var weapon_time = []
  83. var weapon_range = []
  84. var weapon_hd = []
  85. var missile_ammo = []
  86. var missile_st = []
  87. var missile_tt = []
  88. var missile_type = []
  89. var missile_range = []
  90. var num_grappling_hooks = 1
  91. var grappling_hook_speed = 750
  92. var grappling_hook_range = 100
  93. var grappling_hook_cd = 0
  94. var grappling_hook_delay = 1.0
  95. var attack_bonus = 1.0
  96. var defense_bonus = 1.0
  97. var credits = 0
  98. var boarded = false
  99. var thrust = false
  100. var reverse_thrust = false
  101. var rotate = 0
  102. var nav = []
  103. var evading = false
  104. var target
  105. var dock = -1
  106. var station
  107. var docking = false
  108. var ap = false
  109. var disabled = false
  110. var faction = 0
  111. var destroyed = false
  112. var missile_selected = -1
  113. var missile_target
  114. var missile_target_old
  115. var missile_lock = 0.0
  116. var missile_locked = false
  117. var board_target
  118. var boarding = false
  119. var time = 0.0
  120. var size = Vector2(0,0)
  121. var last_collider
  122. var shoot = []
  123. var launch_missile = false
  124. var board = false
  125. var zoom = 1.0
  126. var _name = ""
  127. var icon
  128. #var sparks = preload("res://scenes/particles/sparks.tscn")
  129. #var explosion = preload("res://scenes/particles/explosion.tscn")
  130. func explode():
  131. if (destroyed):
  132. return
  133. destroyed = true
  134. disable_grappling_hook()
  135. set_process(false)
  136. #clear_shapes()
  137. set_sleeping(true)
  138. get_node("/root/Main").ships.erase(self)
  139. #### TODO: Sparks ang eplosions migration to new godot
  140. # for i in range(rand_range(0.05,0.1)*(size.x+size.y)):
  141. # var ang = 2*PI*randf()
  142. # var si = sparks.instance()
  143. # si.lv = 0.75*get_lv()+Vector2(0,-rand_range(200,275)).rotated(ang)
  144. # si.set_initial_velocity(0.5*get_lv()+0.25*si.lv)
  145. # si.position = global_position
  146. # get_node("/root/Main").add_child(si)
  147. #
  148. # var ei = explosion.instance()
  149. # ei.destroy_parent = true # this might get troublesome
  150. # add_child(ei)
  151. emit_signal("destroyed")
  152. destroyed()
  153. func destroyed():
  154. pass
  155. func recalc():
  156. var v_init = Equipment.outfits[ship_type]
  157. for s in Equipment.stats:
  158. if (v_init.has(s)):
  159. base[s] = v_init[s]
  160. else:
  161. base[s] = 0
  162. weapons = []
  163. turrets = []
  164. missiles = []
  165. missile_ammo = []
  166. reactors = []
  167. engines = []
  168. internal = []
  169. external = []
  170. for eq in equipment:
  171. if (eq[Equipment.TYPE]!=""):
  172. var type = Equipment.outfits[eq[Equipment.TYPE]]["type"]
  173. if (type=="reactor"):
  174. reactors.push_back(eq[Equipment.TYPE])
  175. elif (type=="engine"):
  176. engines.push_back(eq[Equipment.TYPE])
  177. elif (type=="internal"):
  178. internal.push_back(eq[Equipment.TYPE])
  179. elif (type=="external"):
  180. external.push_back(eq[Equipment.TYPE])
  181. elif (type=="weapon"):
  182. weapons.push_back(eq[Equipment.TYPE])
  183. elif (type=="turret"):
  184. turrets.push_back(eq[Equipment.TYPE])
  185. elif (type=="missile"):
  186. missiles.push_back(eq[Equipment.TYPE])
  187. missile_ammo.push_back(eq[Equipment.AMMOUNT])
  188. num_reactors = reactors.size()
  189. num_engines = engines.size()
  190. num_internal = internal.size()
  191. num_external = external.size()
  192. num_weapons = weapons.size()
  193. num_turrets = turrets.size()
  194. num_missiles = missiles.size()
  195. reactor_disabled.resize(num_reactors)
  196. reactor_overheating.resize(num_reactors)
  197. reactor_sp.resize(num_reactors)
  198. reactor_sp_max.resize(num_reactors)
  199. reactor_sr.resize(num_reactors)
  200. for i in range(num_reactors):
  201. var v = Equipment.outfits[reactors[i]]
  202. reactor_disabled[i] = false
  203. reactor_overheating[i] = false
  204. reactor_sp[i] = v["sp"]
  205. reactor_sp_max[i] = v["sp"]
  206. reactor_sr[i] = v["stress_dissipation"]
  207. for s in Equipment.ship_stats:
  208. if (v.has(s)):
  209. base[s] += v[s]
  210. engine_disabled.resize(num_engines)
  211. engine_sp.resize(num_engines)
  212. engine_sp_max.resize(num_engines)
  213. engine_sr.resize(num_engines)
  214. for i in range(num_engines):
  215. var v = Equipment.outfits[engines[i]]
  216. engine_disabled[i] = false
  217. engine_sp[i] = v["sp"]
  218. engine_sp_max[i] = v["sp"]
  219. engine_sr[i] = v["stress_dissipation"]
  220. for s in Equipment.ship_stats:
  221. if (v.has(s)):
  222. base[s] += v[s]
  223. internal_disabled.resize(num_internal)
  224. internal_overheating.resize(num_internal)
  225. internal_no_power.resize(num_internal)
  226. internal_sp.resize(num_internal)
  227. internal_sp_max.resize(num_internal)
  228. internal_sr.resize(num_internal)
  229. for i in range(num_internal):
  230. var v = Equipment.outfits[internal[i]]
  231. internal_disabled[i] = false
  232. internal_overheating[i] = false
  233. internal_no_power[i] = false
  234. internal_sp[i] = v["sp"]
  235. internal_sp_max[i] = v["sp"]
  236. internal_sr[i] = v["stress_dissipation"]
  237. for s in Equipment.ship_stats:
  238. if (v.has(s)):
  239. base[s] += v[s]
  240. external_disabled.resize(num_external)
  241. external_overheating.resize(num_external)
  242. external_no_power.resize(num_external)
  243. external_sp.resize(num_external)
  244. external_sp_max.resize(num_external)
  245. external_sr.resize(num_external)
  246. for i in range(num_external):
  247. var v = Equipment.outfits[external[i]]
  248. external_disabled[i] = false
  249. external_overheating[i] = false
  250. external_no_power[i] = false
  251. external_sp[i] = v["sp"]
  252. external_sp_max[i] = v["sp"]
  253. external_sr[i] = v["stress_dissipation"]
  254. for s in Equipment.ship_stats:
  255. if (v.has(s)):
  256. base[s] += v[s]
  257. shoot.resize(num_weapons)
  258. weapon_disabled.resize(num_weapons)
  259. weapon_sp.resize(num_weapons)
  260. weapon_sp_max.resize(num_weapons)
  261. weapon_sr.resize(num_weapons)
  262. weapon_temp.resize(num_weapons)
  263. weapon_cd.resize(num_weapons)
  264. weapon_ep.resize(num_weapons)
  265. weapon_heat.resize(num_weapons)
  266. weapon_st.resize(num_weapons)
  267. weapon_max_temp.resize(num_weapons)
  268. weapon_time.resize(num_weapons)
  269. weapon_range.resize(num_weapons)
  270. weapon_hd.resize(num_weapons)
  271. average_weapon_speed = 0.0
  272. for i in range(num_weapons):
  273. var v = Equipment.outfits[weapons[i]]
  274. weapon_temp[i] = 0.0
  275. weapon_cd[i] = 0.0
  276. weapon_disabled[i] = false
  277. weapon_sp[i] = v["sp"]
  278. weapon_sp_max[i] = v["sp"]
  279. weapon_sr[i] = v["stress_dissipation"]
  280. weapon_ep[i] = v["firing_energy"]
  281. average_weapon_speed += v["speed"]
  282. weapon_sr[i] = v["stress_dissipation"]
  283. weapon_ep[i] = v["firing_energy"]
  284. weapon_heat[i] = v["firing_heat"]
  285. weapon_hd[i] = v["internal_heat_dissipation"]/100.0
  286. weapon_st[i] = v["reload_delay"]
  287. weapon_max_temp[i] = v["internal_max_temperature"]
  288. weapon_time[i] = v["life_time"]
  289. weapon_range[i] = v["range"]
  290. for s in Equipment.ship_stats:
  291. if (v.has(s)):
  292. base[s] += v[s]
  293. average_weapon_speed /= num_weapons
  294. for i in range(num_turrets):
  295. var v = Equipment.outfits[turrets[i]]
  296. for s in Equipment.ship_stats:
  297. if (v.has(s)):
  298. base[s] += v[s]
  299. if (get_node("Turret"+str(i+1)).has_node("Turret")):
  300. get_node("Turret"+str(i+1)+"/Turret").queue_free()
  301. get_node("Turret"+str(i+1)+"/Turret").set_name("deleted")
  302. var ti = Equipment.outfits[turrets[i]]["scene"].instance()
  303. ti.type = turrets[i]
  304. ti.sp_max = Equipment.outfits[ti.type]["sp"]
  305. ti.sr = Equipment.outfits[ti.type]["stress_dissipation"]
  306. ti.range_max = Equipment.outfits[ti.type]["range"]
  307. ti.max_temp = Equipment.outfits[ti.type]["internal_max_temperature"]
  308. ti.heat_dissipation = Equipment.outfits[ti.type]["internal_heat_dissipation"]/100.0
  309. ti.heat = Equipment.outfits[ti.type]["firing_heat"]
  310. ti.ep = Equipment.outfits[ti.type]["firing_energy"]
  311. ti.st = Equipment.outfits[ti.type]["reload_delay"]
  312. ti.av = deg2rad(Equipment.outfits[ti.type]["rotation_speed"])
  313. ti.speed = Equipment.outfits[ti.type]["speed"]
  314. ti.rays = Equipment.outfits[ti.type]["rays"]
  315. get_node("Turret"+str(i+1)).add_child(ti)
  316. missile_selected = num_missiles-1
  317. missile_st.resize(num_missiles)
  318. missile_tt.resize(num_missiles)
  319. missile_type.resize(num_missiles)
  320. missile_range.resize(num_missiles)
  321. for i in range(num_missiles):
  322. var v = Equipment.outfits[missiles[i]]
  323. missile_type[i] = v["targetting_type"]
  324. if (missile_type[i]=="none"):
  325. missile_tt[i] = 0
  326. else:
  327. missile_tt[i] = v["targetting_time"]
  328. missile_range[i] = v["range"]
  329. missile_st[i] = v["reload_delay"]
  330. for s in Equipment.ship_stats:
  331. if (v.has(s)):
  332. base[s] += v[s]*missile_ammo[i]
  333. for i in inventory:
  334. base["mass"] += Equipment.outfits[i[Equipment.TYPE]]["mass"]*i[Equipment.AMMOUNT]
  335. update()
  336. func update():
  337. var values = {}
  338. for s in base.keys():
  339. values[s] = base[s]
  340. for i in range(num_reactors):
  341. if (!reactor_disabled[i] && !reactor_overheating[i]):
  342. var v = Equipment.outfits[reactors[i]]
  343. for s in Equipment.stats:
  344. if (v.has(s+"_active")):
  345. values[s] += v[s+"_active"]
  346. for i in range(num_engines):
  347. if (!engine_disabled[i]):
  348. var v = Equipment.outfits[engines[i]]
  349. for s in Equipment.stats:
  350. if (v.has(s+"_active")):
  351. values[s] += v[s+"_active"]
  352. for i in range(num_internal):
  353. if (!internal_disabled[i] && !internal_overheating[i] && !internal_no_power[i]):
  354. var v = Equipment.outfits[internal[i]]
  355. for s in Equipment.stats:
  356. if (v.has(s+"_active")):
  357. values[s] += v[s+"_active"]
  358. for i in range(num_external):
  359. if (!external_disabled[i] && !external_overheating[i] && !external_no_power[i]):
  360. var v = Equipment.outfits[external[i]]
  361. for s in Equipment.stats:
  362. if (v.has(s+"_active")):
  363. values[s] += v[s+"_active"]
  364. mass = values["mass"]
  365. hp_max = values["armor"]
  366. hr = values["repair"]
  367. sp_max = values["sp"]
  368. sr = values["stress_dissipation"]
  369. ep_max = values["energy"]
  370. er = values["power"]
  371. temp_max = values["max_temperature"]
  372. heat = values["heat"]
  373. heat_dissipation = values["heat_dissipation"]/100.0
  374. la = values["thrust"]/mass
  375. thrust_power = values["thrust_power"]
  376. thrust_heat = values["thrust_heat"]
  377. ts = deg2rad(values["steering"])/mass
  378. steering_power = values["steering_power"]
  379. steering_heat = values["steering_heat"]
  380. damping = values["damping"]/100.0
  381. resist_impact = 1-exp(-values["resistance_impact"]/100.0)
  382. resist_plasma = 1-exp(-values["resistance_plasma"]/100.0)
  383. resist_explosive = 1-exp(-values["resistance_explosive"]/100.0)
  384. cargo = values["cargo_space"]
  385. radar = values["radar_range"]
  386. stealth = values["stealth"]
  387. crew_min = values["min_crew"]
  388. set_mass(mass)
  389. func update_mass(new_mass):
  390. var factor = mass/new_mass
  391. la *= factor
  392. ts *= factor
  393. base["mass"] = new_mass
  394. mass = new_mass
  395. set_mass(mass)
  396. func damage(pos,type,dmg,disable,heat):
  397. var status_changed = false
  398. hp -= dmg*(1.0-{"impact":resist_impact,"plasma":resist_plasma,"explosive":resist_explosive}[type])
  399. if (hp<0):
  400. hp = 0
  401. explode()
  402. return
  403. if (type=="plasma"):
  404. heat *= 1-0-resist_plasma
  405. temp += heat/mass
  406. var dis = 0.25*disable
  407. disable *= 0.75
  408. for i in range(num_external):
  409. var d = min(min(10*disable/max(pos.distance_to(get_node("External"+str(i+1)).global_position),1.0),external_sp[i]),disable)
  410. disable -= d
  411. external_sp[i] -= d
  412. if (external_sp[i]<=0.0):
  413. external_sp[i] = 0.0
  414. if (!external_disabled[i]):
  415. status_changed = true
  416. external_disabled[i] = true
  417. for i in range(num_turrets):
  418. var turret = get_node("Turret"+str(i+1)+"/Turret")
  419. var d = min(min(10*disable/max(pos.distance_to(turret.global_position),1.0),turret.sp),disable)
  420. disable -= d
  421. turret.sp -= d
  422. if (turret.sp<=0.0):
  423. turret.sp = 0.0
  424. if (!turret.disabled):
  425. status_changed = true
  426. turret.disabled = true
  427. for i in range(num_engines):
  428. var d = min(min(10*disable/max(pos.distance_to(get_node("Engine"+str(i+1)).global_position),1.0),engine_sp[i]),disable)
  429. disable -= d
  430. engine_sp[i] -= d
  431. if (engine_sp[i]<=0.0):
  432. engine_sp[i] = 0.0
  433. if (!engine_disabled[i]):
  434. status_changed = true
  435. engine_disabled[i] = true
  436. for i in range(num_weapons):
  437. var d = min(min(10*disable/max(pos.distance_to(get_node("Weapon"+str(i+1)).global_position),1.0),weapon_sp[i]),disable)
  438. disable -= d
  439. weapon_sp[i] -= d
  440. if (weapon_sp[i]<=0.0):
  441. weapon_sp[i] = 0.0
  442. if (!weapon_disabled[i]):
  443. status_changed = true
  444. weapon_disabled[i] = true
  445. for i in range(num_internal):
  446. var d = min(min(10*disable/max(pos.distance_to(get_node("Internal"+str(i+1)).global_position),1.0),internal_sp[i]),disable)
  447. disable -= d
  448. internal_sp[i] -= d
  449. if (internal_sp[i]<=0.0):
  450. internal_sp[i] = 0.0
  451. if (!internal_disabled[i]):
  452. status_changed = true
  453. internal_disabled[i] = true
  454. for i in range(num_reactors):
  455. var d = min(min(10*disable/max(pos.distance_to(get_node("Reactor"+str(i+1)).global_position),1.0),reactor_sp[i]),disable)
  456. disable -= d
  457. reactor_sp[i] -= d
  458. if (reactor_sp[i]<=0.0):
  459. reactor_sp[i] = 0.0
  460. if (!reactor_disabled[i]):
  461. status_changed = true
  462. reactor_disabled[i] = true
  463. sp -= dis+disable
  464. if (sp<=0.0):
  465. sp = 0.0
  466. missile_target = null
  467. disabled = true
  468. status_changed = true
  469. if (status_changed):
  470. update()
  471. damaged(pos,type,dmg,disable,heat)
  472. func damaged(pos,type,dmg,disable,heat):
  473. pass
  474. func get_lv():
  475. return get_linear_velocity()
  476. func select_missile(m):
  477. if (missile_selected==m):
  478. return
  479. if (num_missiles<=m):
  480. missile_selected = -1
  481. missile_locked = false
  482. missile_lock = 0.0
  483. missile_target = null
  484. return
  485. missile_selected = m
  486. missile_locked = false
  487. missile_lock = missile_tt[missile_selected]
  488. missile_target = null
  489. func select_next_missile():
  490. for i in range(missile_selected+1,num_missiles)+range(0,missile_selected):
  491. if (missile_ammo[i]>0):
  492. select_missile(i)
  493. return
  494. select_missile(-1)
  495. func select_prev_missile():
  496. for i in range(missile_selected-1,-1,-1)+range(num_missiles-1,missile_selected,-1):
  497. if (missile_ammo[i]>0):
  498. select_missile(i)
  499. return
  500. select_missile(-1)
  501. func disable_grappling_hook():
  502. for i in range(1,1+num_grappling_hooks):
  503. for c in get_node("GrapplingHook"+str(i)).get_children():
  504. c._detach()
  505. boarding = false
  506. func start_boarding():
  507. pass
  508. func enable_autopilot():
  509. if (nav.size()<1):
  510. return
  511. ap = true
  512. # get_node("RayCast").set_enabled(true)
  513. last_collider = null
  514. func disable_autopilot():
  515. ap = false
  516. nav.clear()
  517. # get_node("RayCast").set_enabled(false)
  518. last_collider = null
  519. func autopilot(delta):
  520. pass
  521. func hud(delta):
  522. pass
  523. func _integrate_forces(state):
  524. if (destroyed):
  525. return
  526. var delta = state.get_step()
  527. var pos = global_position
  528. var rot = rotation
  529. var lv = state.get_linear_velocity()
  530. var av = 0.0
  531. var ht = heat
  532. var dir = Vector2(0,-1).rotated(rot)
  533. var wt = 0.0
  534. var status_changed = false
  535. hp += delta*hr
  536. if (hp>hp_max):
  537. hp = hp_max
  538. sp += delta*sr
  539. if (sp>sp_max):
  540. sp = sp_max
  541. if (!boarding):
  542. if (disabled):
  543. status_changed = true
  544. disabled = false
  545. for i in range(num_reactors):
  546. var overheating = temp>temp_max
  547. reactor_sp[i] += delta*reactor_sr[i]
  548. if (reactor_sp[i]>reactor_sp_max[i]):
  549. reactor_sp[i] = reactor_sp_max[i]
  550. if (reactor_disabled[i]):
  551. status_changed = true
  552. reactor_disabled[i] = false
  553. if (reactor_overheating[i]!=overheating):
  554. status_changed = true
  555. reactor_overheating[i] = overheating
  556. for i in range(num_internal):
  557. internal_sp[i] += delta*internal_sr[i]
  558. if (internal_sp[i]>internal_sp_max[i]):
  559. internal_sp[i] = internal_sp_max[i]
  560. if (internal_disabled[i]):
  561. status_changed = true
  562. internal_disabled[i] = false
  563. if (Equipment.outfits[internal[i]].has("heat_active")):
  564. var overheating = temp+Equipment.outfits[internal[i]]["heat_active"]>temp_max
  565. if (internal_overheating[i]!=overheating):
  566. status_changed = true
  567. internal_overheating[i] = overheating
  568. if (Equipment.outfits[internal[i]].has("power_active") && Equipment.outfits[internal[i]]["power_active"]<0):
  569. var no_power = ep+Equipment.outfits[internal[i]]["power_active"]<0
  570. if (internal_no_power[i]!=no_power):
  571. status_changed = true
  572. internal_no_power[i] = no_power
  573. for i in range(num_external):
  574. external_sp[i] += delta*external_sr[i]
  575. if (external_sp[i]>external_sp_max[i]):
  576. external_sp[i] = external_sp_max[i]
  577. if (external_disabled[i]):
  578. status_changed = true
  579. external_disabled[i] = false
  580. if (Equipment.outfits[external[i]].has("heat_active")):
  581. var overheating = temp+Equipment.outfits[external[i]]["heat_active"]>temp_max
  582. if (external_overheating[i]!=overheating):
  583. status_changed = true
  584. external_overheating[i] = overheating
  585. if (Equipment.outfits[external[i]].has("power_active") && Equipment.outfits[external[i]]["power_active"]<0):
  586. var no_power = ep+Equipment.outfits[external[i]]["power_active"]<0
  587. if (external_no_power[i]!=no_power):
  588. status_changed = true
  589. external_no_power[i] = no_power
  590. for i in range(num_engines):
  591. engine_sp[i] += delta*engine_sr[i]
  592. if (engine_sp[i]>engine_sp_max[i]):
  593. engine_sp[i] = engine_sp_max[i]
  594. if (engine_disabled[i]):
  595. status_changed = true
  596. engine_disabled[i] = false
  597. for i in range(num_weapons):
  598. weapon_sp[i] += delta*weapon_sr[i]
  599. if (weapon_sp[i]>weapon_sp_max[i]):
  600. weapon_sp[i] = weapon_sp_max[i]
  601. # if (weapon_disabled[i]):
  602. # status_changed = true
  603. weapon_disabled[i] = false
  604. autopilot(delta)
  605. if (disabled):
  606. thrust = false
  607. rotate = 0
  608. if (ep<delta*thrust_power || temp+delta*thrust_heat>temp_max || boarding):
  609. thrust = false
  610. if (ep<delta*steering_power*abs(rotate) || temp+delta*steering_heat>temp_max || boarding):
  611. rotate = 0
  612. ep += delta*(er+thrust_power*thrust+steering_power*abs(rotate))
  613. ht += thrust_heat*thrust+steering_heat*abs(rotate)
  614. if (ep>ep_max):
  615. ep = ep_max
  616. missile_cd -= delta
  617. for i in range(num_weapons):
  618. var t = delta*weapon_hd[i]*weapon_temp[i]
  619. wt += t
  620. weapon_temp[i] -= t
  621. weapon_cd[i] -= delta
  622. temp += wt*10.0/mass
  623. if (temp>temp_max):
  624. hp -= delta*(temp-temp_max)
  625. if (hp<0):
  626. explode()
  627. hp = 0
  628. lv *= 1.0-damping*delta
  629. av = ts*rotate
  630. lv += delta*la*dir*thrust
  631. if (ht<0):
  632. ht = 0
  633. temp = temp*(1-delta*heat_dissipation)+delta*ht/mass
  634. get_node("Engine").set_opacity(min(max(get_node("Engine").get_opacity()+delta*10*(thrust-0.5),0.0),1.0))
  635. get_node("SteeringLeft").set_opacity(min(max(get_node("SteeringLeft").get_opacity()+delta*10*((max(-rotate,0))-0.5),0.0),1.0))
  636. get_node("SteeringRight").set_opacity(min(max(get_node("SteeringRight").get_opacity()+delta*10*((max(rotate,0))-0.5),0.0),1.0))
  637. set_linear_velocity(lv)
  638. set_angular_velocity(av)
  639. if (status_changed):
  640. update()
  641. if (disabled || boarding):
  642. return
  643. for i in range(num_weapons):
  644. if (shoot[i] && !weapon_disabled[i] && weapon_cd[i]<=0.0 && ep+weapon_ep[i]>0.0 && weapon_temp[i]+weapon_heat[i]<weapon_max_temp[i] && temp<temp_max):
  645. Weapons.shoot(weapons[i],get_node("Weapon"+str(i+1)),weapon_temp[i]/weapon_max_temp[i]+0.75,dir,rot,lv,faction)
  646. ep += weapon_ep[i]
  647. weapon_temp[i] += weapon_heat[i]
  648. weapon_cd[i] = weapon_st[i]
  649. if (launch_missile && missile_cd<=0.0 && missiles.size()>0 && missile_selected>=0 && missile_ammo[missile_selected]>0 && (missile_locked || missile_type[missile_selected]=="none")):
  650. Weapons.launch(missiles[missile_selected],get_node("Missile"+str(missile_selected+1)),dir,rot,lv,faction,missile_target)
  651. missile_cd =missile_st[missile_selected]
  652. missile_ammo[missile_selected] -= 1
  653. update_mass(mass-Equipment.outfits[missiles[missile_selected]]["mass"])
  654. if (missile_ammo[missile_selected]<=0):
  655. select_next_missile()
  656. func _process(delta):
  657. time += delta
  658. if (missile_target!=null && missile_target==missile_target_old && !disabled):
  659. if (get_node("/root/Main").ships.find(missile_target)==-1):
  660. missile_target = null
  661. missile_locked = false
  662. emit_signal("target_lost")
  663. else:
  664. missile_lock -= delta
  665. emit_signal("targeting")
  666. if (missile_lock<0.0):
  667. missile_lock = 0.0
  668. if (!missile_locked):
  669. missile_locked = true
  670. emit_signal("target_locked")
  671. missile_target_old = missile_target
  672. grappling_hook_cd -= delta
  673. if (board && !boarding && grappling_hook_cd<=0.0):
  674. var tpos = board_target.global_position
  675. for i in range(num_grappling_hooks):
  676. var node = get_node("GrapplingHook"+str(i+1))
  677. var pos = node.global_position
  678. var dir = (tpos-pos).normalized()
  679. var length = max(size.x,size.y)/2.0+16
  680. Weapons.grappling_hook(node,self,pos,dir.angle()-PI,dir,length,length+200,grappling_hook_speed,faction)
  681. grappling_hook_cd = grappling_hook_delay
  682. board = false
  683. hud(delta)
  684. func _init():
  685. mass = 10
  686. func _ready():
  687. add_user_signal("captured")
  688. recalc()
  689. hp = hp_max
  690. ep = ep_max
  691. sp = sp_max
  692. # var ri = RayCast2D.new()
  693. # ri.set_enabled(false)
  694. # ri.add_exception(self)
  695. # ri.set_name("RayCast")
  696. # add_child(ri)
  697. get_node("/root/Main").ships.push_back(self)
  698. set_process(true)
  699. set_process_input(true)
  700. add_user_signal("targeting")
  701. add_user_signal("target_locked")
  702. add_user_signal("target_lost")
  703. add_user_signal("destroyed")
  704. _init()