Basically you need to determine what you want:
- name of the coin. Let's call it AbcCoin in our example. Also determine the symbol, we call it "ABC"
in our example.
- block time: this is the average target time between blocks. Usually you set it between 15 sec and 2 mins.
You can also do 10 mins if you want (like bitcoin), but it's too long imo.
- difficulty retarget time: this is important, since otherwise it could cause serious instamine problem.
Usually it's between 1 hr to 1 day.
(diff retarget time)/(block time) gives you how many blocks a diff retarget will happen. This is
an important parameter to consider.
- what's the initial coin per block. People set it to 2 to 100, usually. You can set any you want.
Also you can do coins per block based on the block number, or even randomly (like JKC/LKY etc).
- How long you want coins per block be halved. Usually it's 6 month to 3 years. But again you set whatever
you like.
- Ports, you need two: connection and RPC ports. Choose the ones that are not used in common apps.
You can google for a particular port usage.

There are some other things you may want to adjust, such as initial diffculty etc. But usually I don't want to bother with these.

Now with these parameters defined, one important thing is that you want to calculate how many blocks/coins
generated in a month, a year etc, and total coins ever will be generated. This gives you a good idea how overall
your coin will work, and you may want to re-adjust some parameters above.

Now the code change part.

Before you begin, copy the whole directory of Litecoin to Abccoin. Then modify the code in Abccoin.

Follow the below steps for code changes:

1. In Abccoin/src dir, do a search of "litecoin", and change most of them to "abccoin", note you may want
to do a case-sensitive replace. You don't have to replace all, but most should be replaced.
You can reference to smallchange code first commit
https://github.com/bfroemel/smallchange/commit/947a0fafd8d033f6f0960c4ff0748f76a3d58326
for the changes needed.

Note: smallchange 1st commit does not include many of the changes I will outline below, but it is a
good reference for what need to be changed.

2. In Abccoin/src dir, do a search on "LTC", and change them to "ABC".

3. Change the ports: use the ones you defined in coin design, and change in the following files:
- connection port: protocol.h and init.cpp
- rpc port: bitcoinrpc.cpp and init.cpp

7. Create genesis block. Some people get stuck there, it's really easy:
- find LoadBlockIndex() function, inside, change:
- paraphrase (pszTimestamp) to any recent news phase.
- get the latest unix time (do a google), and put in block.nTime.
- set any nNonce (doesn't really matter)
you can change the time/nonce for testnet too, if you want to use it.

After you are done, save it. Now the genesis block will not match the hash check and merkle root check, it doesn't matter.

The first time you run the compiled code (daemon or qt), it will say "assertion failed". Just exit the program, go to
config dir (under AppData/Roaming), open the debug.log, get the hash after "block.GetHash() = ", copy and paste it to the beginnig of main.cpp, hashGenesisBlock. Also get the merkle root in the same log file, paste it to the ... position in the following code, in LoadBlockIndex()
assert(block.hashMerkleRoot == uint256("0x..."));

recompile the code, and genesis block created!

BTW, don't forget to change "txNew.vout[0].nValue = " to the coin per block you defined, it doesn't matter to leave as 50, just be consistent with your coin per block (do this before adjust the hash and m-root, otherwise they will be changed again).

Also you need to change the alert/checkpoint key, this depends on the coin type and version, you can find it in main.cpp, main.h, alert.cpp and checkpoint.cpp.

8. Set the correct address start letter in base58.h. You may want to do some trial and error to find the letter you want. I never can calculate precisely the letter location.

9. Checkpoint: you want to disable the checkpoint check initially, otherwise you may get stuck.
You have multiple ways to disable it, my way is:
- open checkpoints.cpp
- there are 3 functions, comment out the normal return, and make them return either true, 0, or null, like this:
bool CheckBlock(int nHeight, const uint256& hash)
{
if (fTestNet) return true; // Testnet has no checkpoints