;;; elite-for-emacs-functions.el - Elite for EMACS functions

;; Elite for EMACS is based on Elite series by Ian Bell and David Braben.
;; Original Elite, (C) 1984 Ian Bell and David Braben.
;; Elite for EMACS uses code from original Elite and it is (C) 1984 Ian Bell and David Braben.
;; Additional code
;; Author: Sami Salkosuo ([email protected])

;; This file is not part of GNU Emacs.

;; GNU Emacs is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 2, or (at your option)
;; any later version.

;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs; see the file COPYING.  If not, write to the
;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
;; Boston, MA 02111-1307, USA.

;; Commentary:


(defun elite-for-emacs-create-new-commander (name gender no-random-home)
 (let (

       )
   ;;(setq name "Sami")
   ;;(setq gender "male")
   (if no-random-home
       (elite-for-emacs-generate-commander name -1 gender 7 0 0)
     (elite-for-emacs-generate-commander name -1 gender (random galsize) 0 0)
     )

   )
 )

(defun elite-for-emacs-get-galaxy (num)
 "Returns galaxy array of galaxy <num>"
 (aref elite-for-emacs-galaxies-in-universe num)
)

(defun elite-for-emacs-get-system-name (galaxy-index system-index)
 "Returns system name of planet in galaxy."
;(elite-get-system-name 41)
 (plansys-name (aref (elite-for-emacs-get-galaxy galaxy-index) system-index))
)

(defun elite-for-emacs-get-current-system-name ()
 "Returns system name of planet in galaxy."
;(elite-get-system-name 41)
 (plansys-name (aref (elite-for-emacs-get-galaxy (elite-for-emacs-commander-current-galaxy (car elite-for-emacs-commander-list))) (elite-for-emacs-commander-current-planet (car elite-for-emacs-commander-list))))
)

(defun elite-for-emacs-get-plansys (galaxy-index system-index)
 "Returns system plansys struct."
;(elite-get-system-name 41)
 (aref (elite-for-emacs-get-galaxy galaxy-index) system-index)
)


(defun elite-for-emacs-get-system-index (galaxy-index system-name &optional within-jump)
"Return index of system-name in galaxy."
 (let (
       (syscount)
       (d 9999)
       (p)
       (temp)
       (cmdr)
       (galaxy)
       )
   (setq syscount 0)
   (setq cmdr (car elite-for-emacs-commander-list))
   (setq p (elite-for-emacs-commander-current-planet cmdr))
   (setq galaxy (aref elite-for-emacs-galaxies-in-universe (elite-for-emacs-commander-current-galaxy cmdr)))
   (while (< syscount galsize)
     (setq temp (string-match (upcase system-name) (elite-for-emacs-get-system-name galaxy-index syscount)))
     (if temp
         (if (= temp 0)  ;(plansys-name (aref galaxy syscount)))
             (progn
               (if (and within-jump (<= (distance (aref galaxy syscount) (aref galaxy (elite-for-emacs-commander-current-planet cmdr))) maxfuel  ))
                   (progn
                     (setq p syscount)
                     (setq syscount 99999)
                     )
                 (progn
                   (if (not within-jump)
                       (progn
                         (setq p syscount)
                         (setq syscount 99999)
                         )
                     )

                   )
                 )
               )
           )
     )
     (setq syscount (1+ syscount))
     )
   p
   )
 )


(defun elite-for-emacs-short-local-system-info (galaxy-index system-index &optional no-format)
 "Return short local system description."
 (let (
       (planet-index)
       (galaxy)
       )
   (setq planet-index system-index)
   (setq galaxy (elite-for-emacs-get-galaxy galaxy-index))
   (if no-format
           (concat
            (plansys-name (aref galaxy planet-index))
            " TL: "
            (number-to-string (1+ (plansys-techlevel (aref galaxy planet-index))))
            " "
            (aref econnames (plansys-economy (aref galaxy planet-index)))
            " "
            (aref govnames (plansys-govtype (aref galaxy planet-index)))
            )
     (concat
      (format "%10s" (plansys-name (aref galaxy planet-index)))
      (format " TL: %2i " (1+ (plansys-techlevel (aref galaxy planet-index))))
      (format "%12s" (aref econnames (plansys-economy (aref galaxy planet-index))))
      (format " %15s" (aref govnames (plansys-govtype (aref galaxy planet-index))))
      )
     )
;;        printf("%10s",plsy.name);
;;      printf(" TL: %2i ",(plsy.techlev)+1);
;;      printf("%12s",econnames[plsy.economy]);
;;      printf(" %15s",govnames[plsy.govtype]);

   )
 )

(defun prisys (plan-s &optional compressed)
 "Returns system info as string on specified system."
 (let(
      (sys-info)
      (cmdr)
      )
 (if compressed
     (progn
       (setq sys-info
             (concat
              (format "%10s" (plansys-name plan-s))
              (format " TL: %2i" (1+ (plansys-techlevel plan-s)))
              (format " %12s " (aref econnames (plansys-economy plan-s)))
              (format " %15s" (aref govnames (plansys-govtype plan-s)))
              ))
       )
   (progn
     (setq cmdr (car elite-for-emacs-commander-list ))
   (setq galaxy (aref elite-for-emacs-galaxies-in-universe (elite-for-emacs-commander-current-galaxy cmdr)))

       (setq sys-info
             (concat
              "System:  "
              (plansys-name plan-s)
              (format "\nPosition (%i,%i)" (plansys-x plan-s) (plansys-y plan-s))
              (format "\nDistance %.1f LY" (/ (distance plan-s (aref (aref elite-for-emacs-galaxies-in-universe (elite-for-emacs-commander-current-galaxy cmdr)) (elite-for-emacs-commander-current-planet cmdr))) 10.0)  )
              (format "\nEconomy: (%i) " (plansys-economy plan-s))
              (aref econnames (plansys-economy plan-s))
              (format "\nGovernment: (%i) " (plansys-govtype plan-s))
              (aref govnames (plansys-govtype plan-s))
              (format "\nTech level: %i " (1+ (plansys-techlevel plan-s)))
;":%5d M CR
              (format "\nGross Productivity: %5d M CR" (plansys-productivity plan-s))
              (format "\nRadius: %i " (plansys-radius plan-s))
              (format "\nPopulation: %i Billion" (lsh (plansys-population plan-s) -3))
              ;;(format "\nPopulation: %i Billion" (plansys-population plan-s))
              ;;" (" ")"
              "\n"
              (elite-for-emacs-planet-description (elite-for-emacs-commander-current-galaxy cmdr) (elite-for-emacs-get-system-index (elite-for-emacs-commander-current-galaxy cmdr) (plansys-name plan-s)))


              ))

     ))
 sys-info
 ))

(defun elite-for-emacs-trade-good-index (tradegood)
 "Returns index of tradegood in tradegood array."
 (let (
       (i)
       (index)
       (len)
       )
   (setq len (length tradnames))
   (setq i 0)
   (while (< i len)
     (if (string-match tradegood (aref tradnames i))
         (progn
           (setq index i)
           (setq i 9999)
           )
       )
     (setq i (1+ i))
     )
   index

   )
)

(defun elite-for-emacs-match-trade-item (trade-item)
 "Return first match of trade-item string"
 (let (
       (len)
       (item)
       (item-name)
       (i)
       )
   (setq len (length commodities))
   (setq i 0)
   (while (< i len)
     (setq item (tradegood-name (aref commodities i)))
     (setq i (1+ i))
     )
   (catch 'found

     )

   )
 )


(defun elite-for-emacs-get-first-equipment-match (equipment-name)
 "Return first equipment struct where name matches."
 (let (
       (equipment-list)
       (temp)
       (index)
       (equip nil)
       )
   ;;(setq equipment-name "carg")
   (setq equipment-list elite-for-emacs-equipment-list)
   (while equipment-list
     (setq temp (car equipment-list))
     (setq index (string-match equipment-name (equipment-name temp)))
     (if (and index (= index 0))
         (progn
           (setq equipment-list nil)
           (setq equip temp)
           )
             )
     (setq equipment-list (cdr equipment-list))
     )
   equip
   )
 )


(defun elite-for-emacs-insert ()
 "Inserts elite-for-emacs in buffer"
 (interactive)
 (insert "elite-for-emacs-")
)
(define-key emacs-lisp-mode-map "\C-c\C-l" 'elite-for-emacs-insert)

(defun elite-for-emacs-insert-defun-skeleton ()
 (interactive)
 (let (
       (pnt)
       )
   (insert "(defun elite-for-emacs-")
   (setq pnt (point))
   (insert " ()\n")
   (lisp-indent-line)
   (insert "\"\"\n")
   (lisp-indent-line)
   (insert "(let (\n")
   (lisp-indent-line)
   (insert "(cmdr)")
   (insert "\n")
   (lisp-indent-line)
   (insert ")\n")
   (lisp-indent-line)
   (insert "(setq cmdr (car elite-for-emacs-commander-list))\n\n")
   (lisp-indent-line)
   (insert ")\n")
   (lisp-indent-line)
   (insert ")\n")
   (goto-char pnt)

   )
)
(define-key emacs-lisp-mode-map "\C-c\C-d" 'elite-for-emacs-insert-defun-skeleton)