Kampf um Resourcen. Programmieren von Gewusel: Unterschied zwischen den Versionen
aus dem Wiki des Entropia e.V., CCC Karlsruhe
Astro (Diskussion | Beiträge) (Updater hinzugefügt) |
Guest (Diskussion | Beiträge) |
||
Zeile 105: | Zeile 105: | ||
---------------------------------------------------------------------------------</pre> | ---------------------------------------------------------------------------------</pre> | ||
</pre> | |||
==Blueloop V01== | |||
<pre> | |||
-------------------------------------------------------------------------- | |||
-- Default Logik | |||
-- | |||
-- Fuer jedes gespawnte Vieh wird eine eigene Creature Klasse instanziiert | |||
-------------------------------------------------------------------------- | |||
function Creature:onSpawned() | |||
print("Creature " .. self.id .. " spawned") | |||
end | |||
function Creature:onAttacked(attacker) | |||
print("Help! Creature " .. self.id .. " is attacked by Creature " .. attacker) | |||
-- Ich bin noch zu klein zum kämpfen | |||
if (get_type(self.id) == 0) or (self:health() > 20) then | |||
local x,y = self:pos() | |||
-- weglaufen | |||
self:set_path(x-16000+math.random(8000),y-1600+math.random(8000)) | |||
self:begin_walk_path() | |||
else -- Smack my Bit up! | |||
self:set_target(attacker) | |||
self:begin_attacking() | |||
end | |||
end | |||
function Creature:onKilled(killer) | |||
if killer == self.id then | |||
print("Creature " .. self.id .. " suicided") | |||
elseif killer then | |||
print("Creature " .. self.id .. " killed by Creature " .. killer) | |||
else | |||
print("Creature " .. self.id .. " died") | |||
end | |||
end | |||
function Creature:Wait() | |||
while (get_state(self.id) ~= CREATURE_IDLE) do | |||
self:wait_for_next_round() | |||
end; | |||
end | |||
function Creature:Fressen() | |||
if get_tile_food(self.id) > 0 then | |||
set_state(self.id, CREATURE_EAT) | |||
self:Wait() | |||
else | |||
local x, y = self:pos() | |||
if not self:moveto(x+self.dx,y+self.dy) then | |||
self.dx = math.random(256)-128 | |||
self.dy = math.random(256)-128 | |||
end | |||
end | |||
if self:health() < 90 then | |||
set_state(self.id, CREATURE_HEAL) | |||
self:Wait() | |||
end | |||
end | |||
function Creature:Angreifen() | |||
-- Wo ist der nächste Feind? | |||
local feind_id, feind_x, feind_y, feind_playernum, feind_dist = nearest_enemy(self.id) | |||
-- Wenn er nah genug ist und wir gesund sind -> angreifen | |||
if (feind_id ~= nil) and (feind_dist < 500) and (self:health() > 60) then | |||
print("Starte Angriff auf " .. feind_id .. " Abstand: " .. feind_dist) | |||
while (exists(feind_id)) do | |||
local x,y = get_pos(feind_id) -- Wo ist der angegriffene? | |||
self:moveto(x,y) -- hinlaufen | |||
self:attack(feind_id) -- angreifen! | |||
self:Wait() | |||
end | |||
end | |||
end | |||
function Creature:main() | |||
if self.dx == nil then self.dx = 256 end | |||
if self.dy == nil then self.dy = 0 end | |||
if victim == nil then victim = -1 end | |||
if get_type(self.id) == 0 then | |||
print("Creature " .. self.id .. " soll fressen") | |||
while get_food(self.id) < 8000 do | |||
self:Fressen() | |||
end | |||
print("Creature " .. self.id .. " soll sich verwandeln") | |||
set_convert(self.id, 1) | |||
set_state(self.id,CREATURE_CONVERT) | |||
self:Wait() | |||
else | |||
print("Creature " .. self.id .. " soll fressen") | |||
while get_food(self.id) < 8000 do | |||
self:Fressen() | |||
self:Angreifen() | |||
end | |||
print("Creature " .. self.id .. " vermehrt sich") | |||
set_state(self.id,CREATURE_SPAWN) | |||
self:Wait() | |||
--print("Creature " .. self.id .. " soll zu King of the Hill") | |||
--self:moveto(get_koth_pos()) | |||
--self:Wait() | |||
--print("Creature " .. self.id .. " ist King of the Hill") | |||
--while self:health() > 30 do | |||
-- local feind_id, feind_x, feind_y, feind_playernum, feind_dist = nearest_enemy(self.id) | |||
-- self:attack(feind_id) | |||
--end | |||
end | |||
end | |||
</pre> | |||
==Updater== | ==Updater== |
Version vom 10. Juni 2006, 01:05 Uhr
Hier ein kleines Beispielscript:
Blueloop V00
-------------------------------------------------------------------------- -- Blueloop V00 -- -- Fuer jedes gespawnte Vieh wird eine eigene Creature Klasse instanziiert -------------------------------------------------------------------------- function Creature:onSpawned() print("Creature " .. self.id .. " spawned") end function Creature:onAttacked(attacker) print("Help! Creature " .. self.id .. " is attacked by Creature " .. attacker) end function Creature:onKilled(killer) if killer == self.id then print("Creature " .. self.id .. " suicided") elseif killer then print("Creature " .. self.id .. " killed by Creature " .. killer) else print("Creature " .. self.id .. " died") end end function Wait() while (get_state(self.id) ~= CREATURE_IDLE) do self:wait_for_next_round() end; end function Creature:main() if self.dx == nil then self.dx = 256 end if self.dy == nil then self.dy = 0 end if victim == nil then victim = -1 end ---------------------------------------------- Wenn ein globaler Angriff aktiv ist: if (victim ~= -1) and (get_type(self.id) == 1) then if exists(victim) then local x,y = get_pos(victim) -- Wo ist der angegriffene? self:moveto(x,y) -- hinlaufen self:attack(victim) -- angreifen! else victim = -1 -- Tot -> Angriff beenden print"Angriff beendet!" end end ---------------------------------------------- Warten bis Creatur IDLE if get_state(self.id) ~= CREATURE_IDLE then self:wait_for_next_round() return end ---------------------------------------------- Wo ist der nächste Feind? local feind_id, feind_x, feind_y, feind_playernum, feind_dist = nearest_enemy(self.id) ---------------------------------------------- Wenn er nah genug ist und wir gesund sind -> angreifen if (feind_id ~= nil) and (victim == -1) then if (feind_dist < 8000) and (self:health() > 50) and (victim == -1) then print("Starte Angriff auf " .. feind_id ) victim = feind_id end end ---------------------------------------------- Fressen! if get_tile_food(self.id) > 0 then set_state(self.id, CREATURE_EAT) else local x, y = self:pos() if not self:moveto(x+self.dx,y+self.dy) then self.dx = math.random(512)-256 self.dy = math.random(512)-256 end end if self:health() < 90 then set_state(self.id, CREATURE_HEAL) end; if get_food(self.id) > 8000 then if get_type(self.id) == 0 then set_convert(self.id, 1) set_state(self.id,CREATURE_CONVERT) else set_state(self.id,CREATURE_SPAWN) end end if get_state(self.id) == CREATURE_IDLE then self:moveto(get_koth_pos()) end self:wait_for_next_round() end ---------------------------------------------------------------------------------
Blueloop V01
-------------------------------------------------------------------------- -- Default Logik -- -- Fuer jedes gespawnte Vieh wird eine eigene Creature Klasse instanziiert -------------------------------------------------------------------------- function Creature:onSpawned() print("Creature " .. self.id .. " spawned") end function Creature:onAttacked(attacker) print("Help! Creature " .. self.id .. " is attacked by Creature " .. attacker) -- Ich bin noch zu klein zum kämpfen if (get_type(self.id) == 0) or (self:health() > 20) then local x,y = self:pos() -- weglaufen self:set_path(x-16000+math.random(8000),y-1600+math.random(8000)) self:begin_walk_path() else -- Smack my Bit up! self:set_target(attacker) self:begin_attacking() end end function Creature:onKilled(killer) if killer == self.id then print("Creature " .. self.id .. " suicided") elseif killer then print("Creature " .. self.id .. " killed by Creature " .. killer) else print("Creature " .. self.id .. " died") end end function Creature:Wait() while (get_state(self.id) ~= CREATURE_IDLE) do self:wait_for_next_round() end; end function Creature:Fressen() if get_tile_food(self.id) > 0 then set_state(self.id, CREATURE_EAT) self:Wait() else local x, y = self:pos() if not self:moveto(x+self.dx,y+self.dy) then self.dx = math.random(256)-128 self.dy = math.random(256)-128 end end if self:health() < 90 then set_state(self.id, CREATURE_HEAL) self:Wait() end end function Creature:Angreifen() -- Wo ist der nächste Feind? local feind_id, feind_x, feind_y, feind_playernum, feind_dist = nearest_enemy(self.id) -- Wenn er nah genug ist und wir gesund sind -> angreifen if (feind_id ~= nil) and (feind_dist < 500) and (self:health() > 60) then print("Starte Angriff auf " .. feind_id .. " Abstand: " .. feind_dist) while (exists(feind_id)) do local x,y = get_pos(feind_id) -- Wo ist der angegriffene? self:moveto(x,y) -- hinlaufen self:attack(feind_id) -- angreifen! self:Wait() end end end function Creature:main() if self.dx == nil then self.dx = 256 end if self.dy == nil then self.dy = 0 end if victim == nil then victim = -1 end if get_type(self.id) == 0 then print("Creature " .. self.id .. " soll fressen") while get_food(self.id) < 8000 do self:Fressen() end print("Creature " .. self.id .. " soll sich verwandeln") set_convert(self.id, 1) set_state(self.id,CREATURE_CONVERT) self:Wait() else print("Creature " .. self.id .. " soll fressen") while get_food(self.id) < 8000 do self:Fressen() self:Angreifen() end print("Creature " .. self.id .. " vermehrt sich") set_state(self.id,CREATURE_SPAWN) self:Wait() --print("Creature " .. self.id .. " soll zu King of the Hill") --self:moveto(get_koth_pos()) --self:Wait() --print("Creature " .. self.id .. " ist King of the Hill") --while self:health() > 30 do -- local feind_id, feind_x, feind_y, feind_playernum, feind_dist = nearest_enemy(self.id) -- self:attack(feind_id) --end end end
Updater
require 'socket' require 'timeout' class GameConn def initialize @sock = TCPSocket.new('23.42.2.254', 1234) while buf = read_with_timeout if buf =~ /Press \<enter\>/ @sock.puts elsif buf =~ /enter '\?' for help/ @sock.puts 'j' elsif buf =~ /enter \<playernum\> or press enter for new player: / return end end end def join_already(num, password) @sock.puts(num) while buf = read_with_timeout if buf =~ /password for player \d+: / @sock.puts(password) elsif buf =~ /joined\. / return elsif buf =~/could not attach to player/ raise buf end end end def join_new(password) @sock.puts while buf = read_with_timeout if buf =~ /password for new player: / @sock.puts(password) elsif buf =~ /joined\. / puts buf return end end end def name=(n) @sock.puts 'n' while buf = read_with_timeout if buf =~ /Player Name: / @sock.puts n elsif buf =~ /\> / return elsif buf =~ /cannot set name/ raise buf end end end def read_with_timeout buf = '' while buf.size == 0 begin Timeout::timeout(0.1) { buf += @sock.read(1) while true } rescue Timeout::Error end end buf end def debug_loop! while buf = read_with_timeout print buf end end def batch(source) @sock.puts 'b' while buf = read_with_timeout if buf =~ /enter your lua code/ @sock.puts source + "\n." elsif buf =~ /\> / return end end end end g = GameConn.new if true # Bei Bedarf zu false ändern g.join_already(6, '123') else g.join_new('123') end g.name = 'CoolBot' g.batch(IO::readlines('coolbot.lua').to_s) g.debug_loop!