File: control_method.cpp

package info (click to toggle)
btanks 0.9.8083-9
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, forky, sid, trixie
  • size: 43,616 kB
  • sloc: cpp: 46,425; ansic: 12,005; xml: 4,262; python: 313; sh: 13; makefile: 13
file content (58 lines) | stat: -rw-r--r-- 1,410 bytes parent folder | download | duplicates (5)
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
#include "control_method.h"

ControlMethod::ControlMethod() : _release_set(false), _release_timer(false) {
	_release_timer.set(0.075f);
}

void ControlMethod::updateState(PlayerSlot &slot, PlayerState &state, const float dt) {
	_updateState(slot, state, dt);
	
	int dirs = 0;
	dirs += state.left;
	dirs += state.right;
	dirs += state.up;
	dirs += state.down;

	int old_dirs = 0;
	old_dirs += _old_state.left;
	old_dirs += _old_state.right;
	old_dirs += _old_state.up;
	old_dirs += _old_state.down;
	
	if (state.compare_directions(_old_state) || (old_dirs != 2 || dirs != 1)) {
		_old_state = state;
		return;
	}
	
	if (!_release_set) {
		//LOG_DEBUG(("setting release timer"));
		_release_timer.reset();
		_release_set = true;
		state = _old_state;
		return;
	} else if (_release_timer.tick(dt)) {
		//LOG_DEBUG(("release timer stopped"));
		_old_state = state;
		_release_set = false;	
	} else {
		if ((!state.left && _old_state.left) || (!state.right && _old_state.right)) {
			if ((!state.up && _old_state.up) || (!state.down && _old_state.down)) {
				LOG_DEBUG(("atomically update diagonal"));
				_old_state = state;
				_release_set = false;
				return;
			}
		}
		state = _old_state;
		return;
	}
}

const std::string ControlMethod::get_name(PlayerState& state) const {
	std::vector<std::string> c;
	get_name(c, state);
	std::string r;
	mrt::join(r, c, "+");
	mrt::replace(r, " ", "\\s");
	return r;
}