File: com_04d.lua

package info (click to toggle)
blobby 1.1.1%2Bds-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,944 kB
  • sloc: cpp: 22,442; xml: 779; python: 56; makefile: 3
file content (139 lines) | stat: -rw-r--r-- 3,987 bytes parent folder | download | duplicates (7)
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
-- Flags und runners
wait = 0
naechsterBallSchmettern = true -- evtl Variablennamen wechseln
angriffsstaerke = 50 -- versetzung zum Ball je grsser desto tiefer fliegt der Service 0-64(  64 ist ca CONST_BALLRADIUS + CONST_BLOBBY_BAUCH_RADIUS) 
angriffsstaerkeNeuBerechnen =false -- neuberechnung von angriffsstaerke => Variable Angriffe

-- Konstanten

CONST_FELD_LAENGE = 800
CONST_BALL_RADIUS = 31.5
CONST_GROUND_PLANE = 100

CONST_MITTE = CONST_FELD_LAENGE/2
CONST_RECHTER_RAND = CONST_FELD_LAENGE - CONST_BALL_RADIUS


CONST_BLOBBY_HOEHE = 89
CONST_BLOBBY_KOPF_RADIUS = 25
CONST_BLOBBY_BAUCH_RADIUS = 33
CONST_BLOBBY_KOPF_BERUEHRUNG = CONST_GROUND_PLANE + CONST_BLOBBY_HOEHE + CONST_BALL_RADIUS

CONST_NETZ_RADIUS = 7
CONST_NETZ_HOEHE = 157

-- Linke Berhrungsebene des Balls falls er ans Netz kommt
CONST_NETZ_LINKS = CONST_MITTE - CONST_NETZ_RADIUS - CONST_BALL_RADIUS 



function OnOpponentServe()
	moveto(120)
	generatenaechsterBallSchmettern() -- der gegner soll den smash ja nicht vorhersagen knnen
end

function OnServe(ballready)
	moveto(ballx())
	wait = wait + 1 
	naechsterBallSchmettern = true
	if ballready then
		if wait > 90 then
			jump()
			wait = 0
		end
	end
end	

function OnGame()
	naechsterBallSchmetternFlagTesten() -- schaut ob der bot angreifen soll oder nicht
	target = estimImpact(ballx(),bally(),bspeedx(),bspeedy(),CONST_BLOBBY_KOPF_BERUEHRUNG)	
	
	if target > 440 then
		moveto(120)
	else	
		if naechsterBallSchmettern then
			sprungattacke(angriffsstaerke)
			return
		end

		-- nun kmmern wir uns um die Blle die ans netz prallen
		if ((target > CONST_NETZ_LINKS) and (ballx() < CONST_NETZ_LINKS)) then
			netzappraller(target)
			return
		end

		moveto(target)
	end
end


function netzappraller(p_target)
		moveto(CONST_NETZ_LINKS - (p_target - CONST_NETZ_LINKS) + math.abs(bspeedx()*bspeedx()*1.4))
end



function sprungattacke(p_angriffsstaerke)
		moveto(ballx()-p_angriffsstaerke) -- Bei der Sprungatacke wird die Strke des gewnschten schlages angegeben
		if bally() < 580 then
			jump()
		end
end

function naechsterBallSchmetternFlagTesten()
	if (touches() == 3) then -- falls der Bot einen Anschlag Findet der Direckt punktet so wird der Wer nicht neu berechnet da er dann nciht auf 3 Berhrungen kommt
		naechsterBallSchmettern = false
		angriffsstaerkeNeuBerechnen = true -- da wrde es sicher auch einen Inteligenteren Test geben.
		return
	end
	
	if (angriffsstaerkeNeuBerechnen == true) then
		generatenaechsterBallSchmettern()
	end
	

	if (ballx() > CONST_MITTE) then -- wenn der ball auf der Anderen Seite ist soll der bot nicht naechsterBallSchmettern sein
		naechsterBallSchmettern = false 
		return
	end
	
	if (touches() == 2) then -- nach der 2. Berhrung angreifen
		if (bally() > 500) then -- erst wenn der Ball hoeher als 500 fliegt sonst gibt es keinen schnen Schmetterball.
			naechsterBallSchmettern = true
		end
		return
	end

	if ((ballx() < (400-CONST_BALL_RADIUS)) and (bally() < 200) and (math.abs(bspeedx()) < 40)) then -- der ball knnte noch drber fliegen ** noch optimieren
		naechsterBallSchmettern = true
		return
	end
end

function generatenaechsterBallSchmettern()
	angriffsstaerkeNeuBerechnen = false;
	angriffsstaerke = math.random(20,55) -- variiert mit der Angriffsstrke also auch mit den Anschlgen
end

function estimImpact(bx,by,vbx,vby,destY) -- erlaubt ein besseres Estimate mit ein paar umbeding ntigen Angaben
	bgrav = 0.28	

    time1 =(-vby-math.sqrt((vby^2)-(-2*bgrav*(by-destY))))/(-bgrav)
    resultX = (vbx * time1) + bx

	if(resultX < CONST_BALL_RADIUS) then -- korrigieren der Appraller an der Hinteren Ebene
		resultX = math.abs(CONST_BALL_RADIUS - resultX) + CONST_BALL_RADIUS
	end
	
	if(resultX > CONST_RECHTER_RAND) then -- Korrigieren der Appraller an der Rechten Ebene
		resultX = CONST_FELD_LAENGE - (resultX - CONST_FELD_LAENGE)
	end

    return resultX
end

function cleanMoveTo(position) -- eine nette Spielerei ;)
	if (posx() ~= position) then
		moveto(position)
	end	
end