<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://robowiki.net/w/index.php?action=history&amp;feed=atom&amp;title=Nekolh%2Fsource</id>
	<title>Nekolh/source - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://robowiki.net/w/index.php?action=history&amp;feed=atom&amp;title=Nekolh%2Fsource"/>
	<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Nekolh/source&amp;action=history"/>
	<updated>2026-05-02T05:11:42Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.34.1</generator>
	<entry>
		<id>http://robowiki.net/w/index.php?title=Nekolh/source&amp;diff=58153&amp;oldid=prev</id>
		<title>Ersamson: Created page with &quot;Feel free to adopt, adapt and improve. Credits too when possible. :3  &lt;pre&gt; package ers.nano.nekolh;  /**  * Creator: ER Samson  *   * Credits:  * All Robocode developers and...&quot;</title>
		<link rel="alternate" type="text/html" href="http://robowiki.net/w/index.php?title=Nekolh/source&amp;diff=58153&amp;oldid=prev"/>
		<updated>2026-04-28T17:44:09Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;Feel free to adopt, adapt and improve. Credits too when possible. :3  &amp;lt;pre&amp;gt; package ers.nano.nekolh;  /**  * Creator: ER Samson  *   * Credits:  * All Robocode developers and...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Feel free to adopt, adapt and improve. Credits too when possible. :3&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package ers.nano.nekolh;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Creator: ER Samson&lt;br /&gt;
 * &lt;br /&gt;
 * Credits:&lt;br /&gt;
 * All Robocode developers and Robowiki!&lt;br /&gt;
 * &lt;br /&gt;
 * What's Different?&lt;br /&gt;
 * GUN - A compact pattern-matching gun that uses a fixed (hardcoded) depth of 8 &lt;br /&gt;
 * and try-catch fixed match instead of iterative while-loop matching this is to&lt;br /&gt;
 * fit the look-up multimode behavior for movement&lt;br /&gt;
 * &lt;br /&gt;
 * MOVEMENT - A lightweight multimode table that has 3-major movement states&lt;br /&gt;
 * with a tweaked random oscillation logic by percentage so the behavior changes&lt;br /&gt;
 * when losing, hopefully to throw off learned targeters&lt;br /&gt;
 * &lt;br /&gt;
 * Feel free to adopt, adapt and improve. Credits too when possible. :3&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
import robocode.*;&lt;br /&gt;
import robocode.util.Utils;&lt;br /&gt;
//import java.awt.*;&lt;br /&gt;
&lt;br /&gt;
public class Nekolh extends AdvancedRobot {&lt;br /&gt;
&lt;br /&gt;
	/* ---------- Movement Variables ---------- */&lt;br /&gt;
	private static final int 	MV_FACTOR			= 3000;&lt;br /&gt;
	private static final int	T_DIST				= 180;&lt;br /&gt;
	private static double 		moveDir;&lt;br /&gt;
	private static double		enemyEnergy;&lt;br /&gt;
	private static int			moveMode;&lt;br /&gt;
&lt;br /&gt;
	/* ---------- Gun Variables ---------- */&lt;br /&gt;
	private static final int	B_POWER				= 2;&lt;br /&gt;
	private static final int	B_VELOCITY			= (int)(20 - 3 * B_POWER);&lt;br /&gt;
	private static final int	ANTIRAM_FACTOR		= 96;&lt;br /&gt;
	private static final int	PATTERN_DEPTH		= 8;&lt;br /&gt;
	private static String 		enemyHistory 		= &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	public void run() {&lt;br /&gt;
		// Color Identification&lt;br /&gt;
		//setColors(Color.blue, Color.red, Color.orange);&lt;br /&gt;
&lt;br /&gt;
		// Easy targetting and infinite radar movement&lt;br /&gt;
        //setAdjustGunForRobotTurn(true); // Saving code size!&lt;br /&gt;
		setTurnRadarRightRadians(moveDir = Double.POSITIVE_INFINITY);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void onScannedRobot(ScannedRobotEvent e) {&lt;br /&gt;
	&lt;br /&gt;
		/* ---------- Generic Variables ---------- */&lt;br /&gt;
		int patternIndex;&lt;br /&gt;
		double absoluteBearing;&lt;br /&gt;
		double enemyDistance;		&lt;br /&gt;
		int tickIndex;	&lt;br /&gt;
			&lt;br /&gt;
&lt;br /&gt;
		/* ---------- Musashi Movement Logic ----------	*/&lt;br /&gt;
		// Turn perpendicular to enemy, maintain distance, no wall avoidance D:	&lt;br /&gt;
		// CREDIT: Yatagan			&lt;br /&gt;
		setTurnRightRadians(Math.cos((absoluteBearing = e.getBearingRadians()) + &lt;br /&gt;
			((T_DIST - (enemyDistance = e.getDistance())) * (getVelocity() / MV_FACTOR))));&lt;br /&gt;
&lt;br /&gt;
		 &lt;br /&gt;
		/* ---------- Gun Logic ---------- */&lt;br /&gt;
		// Heavily modified PM Gun from RoboWiki - CREDIT: Exauge&lt;br /&gt;
		// Using Try-Catch for OOBE, pattern matching hardcoded to 8&lt;br /&gt;
		// Turns into HOT Gun when patternIndex is (-1)&lt;br /&gt;
		&lt;br /&gt;
									      // Removed Math.round to save bytes!&lt;br /&gt;
		enemyHistory = String.valueOf((char)(e.getVelocity() *&lt;br /&gt;
			Math.sin(e.getHeadingRadians() - (absoluteBearing = (e.getBearingRadians() + &lt;br /&gt;
			getHeadingRadians()))))).concat(enemyHistory); 			&lt;br /&gt;
&lt;br /&gt;
		// This is where most of the code cuts happen! Removed While-Loop&lt;br /&gt;
		try { &lt;br /&gt;
			patternIndex = enemyHistory.indexOf(enemyHistory.substring(0, PATTERN_DEPTH),&lt;br /&gt;
			tickIndex = (int)(enemyDistance) / B_VELOCITY);&lt;br /&gt;
&lt;br /&gt;
			do {   // Removed Math.asin to save bytes - CREDIT: WeekendObsession_S&lt;br /&gt;
				absoluteBearing += (byte)enemyHistory.charAt(patternIndex--) / enemyDistance; &lt;br /&gt;
			} while (tickIndex-- &amp;gt; 0); &lt;br /&gt;
		} catch (StringIndexOutOfBoundsException oobe) {} // Can still be optimized! &lt;br /&gt;
		&lt;br /&gt;
		setTurnGunRightRadians(Utils.normalRelativeAngle(absoluteBearing - getGunHeadingRadians()));&lt;br /&gt;
&lt;br /&gt;
		// Distance-based bullet power (2, 3), Anti-Rammer&lt;br /&gt;
		setFire(B_POWER + (int)(ANTIRAM_FACTOR / enemyDistance));&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
		/* ---------- Movement Logic ---------- */&lt;br /&gt;
		// Multimode movement - CREDIT: Yatagan, AralT, PraldeGuerre&lt;br /&gt;
		// 10000 = Orbit, 0 = Energy Drop, various Random Oscillation&lt;br /&gt;
		setAhead(moveDir);&lt;br /&gt;
		if ((char)(MV_TABLE.charAt(moveMode) * Math.random() + &lt;br /&gt;
			(enemyEnergy - 1 - (enemyEnergy = e.getEnergy()))) &amp;lt; 4) { 	&lt;br /&gt;
			onHitWall(null); // CREDIT: Simonton&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		/* ---------- Radar Logic ---------- */&lt;br /&gt;
		// From RoboWiki&lt;br /&gt;
		setTurnRadarLeft(getRadarTurnRemaining());		&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Reverse direction when I hit wall&lt;br /&gt;
	 */&lt;br /&gt;
	public void onHitWall(HitWallEvent e) {&lt;br /&gt;
		moveDir = -moveDir;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * On death, change movement strategy.&lt;br /&gt;
	 */&lt;br /&gt;
	public void onDeath(DeathEvent event) {&lt;br /&gt;
		moveMode++;&lt;br /&gt;
	}	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Table constants (modified) - CREDIT: AralT&lt;br /&gt;
	 */&lt;br /&gt;
	private final static char  ORBIT	= (char) 20000; // Orbit&lt;br /&gt;
	private final static char  EDROP	= (char) 0;     // Stop-Go&lt;br /&gt;
	private final static char  OSC_1	= (char) 55;    // Random Oscillation ~9%&lt;br /&gt;
	private final static char  OSC_2	= (char) 42;    // Random Oscillation ~12%&lt;br /&gt;
	private final static char  OSC_3	= (char) 33;    // Random Oscillation ~15%&lt;br /&gt;
	&lt;br /&gt;
	private final static String MV_TABLE = &amp;quot;&amp;quot; + ORBIT + EDROP + ORBIT + EDROP &lt;br /&gt;
			  + OSC_1 + OSC_1 + OSC_2 + OSC_2 + OSC_3 + OSC_3 + OSC_1 + OSC_1&lt;br /&gt;
			  + OSC_2 + OSC_2 + OSC_3 + OSC_3 + OSC_1 + OSC_1 + OSC_2 + OSC_2&lt;br /&gt;
			  + OSC_3 + OSC_3 + OSC_1 + OSC_1 + OSC_2 + OSC_2 + OSC_3 + OSC_3&lt;br /&gt;
			  + OSC_1 + OSC_1 + OSC_2 + OSC_2 + OSC_3 + OSC_3 + OSC_1 + OSC_1&lt;br /&gt;
		&lt;br /&gt;
			  // Overflow movements&lt;br /&gt;
			  + OSC_2 + OSC_2 + OSC_2 + OSC_3 + OSC_3 + OSC_1 + OSC_1 + OSC_1&lt;br /&gt;
			  + OSC_2 + OSC_2 + OSC_2 + OSC_3 + OSC_3 + OSC_1 + OSC_1 + OSC_1&lt;br /&gt;
			  + OSC_2 + OSC_2 + OSC_2 + OSC_3 + OSC_3 + OSC_1 + OSC_1 + OSC_1&lt;br /&gt;
			  + OSC_2 + OSC_2 + OSC_2 + OSC_3 + OSC_3 + OSC_1 + OSC_1 + OSC_1&lt;br /&gt;
			  + OSC_2 + OSC_2 + OSC_2 + OSC_3 + OSC_3 + OSC_1 + OSC_1 + OSC_1&lt;br /&gt;
			  + OSC_2 + OSC_2 + OSC_2 + OSC_3 + OSC_3 + OSC_1 + OSC_1 + OSC_1&lt;br /&gt;
			  + OSC_2 + OSC_2 + OSC_2 + OSC_3 + OSC_3 + OSC_1 + OSC_1 + OSC_1&lt;br /&gt;
			  + OSC_2 + OSC_2 + OSC_2 + OSC_3 + OSC_3 + OSC_1 + OSC_1 + OSC_1&lt;br /&gt;
			  + OSC_2 + OSC_2 + OSC_2 + OSC_3 + OSC_3 + OSC_1 + OSC_1 + OSC_1&lt;br /&gt;
			  + OSC_2 + EDROP + OSC_2 + OSC_2 + EDROP + ORBIT + EDROP + ORBIT;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ersamson</name></author>
		
	</entry>
</feed>